目录
一、简介
消息队列在现代软件架构中已经成为不可或缺的中间件,如果你曾经搭建过系统服务需要用到消息中间件,一定会思考到底怎么选择呢?消息队列的主要功能如下:解耦、异步、扩展性、流量削峰、顺序保障、缓存等。
出于某种原因,在大多数场景中 Kafka 和 RabbitMQ 是可以互换的,很多程序员可能都这么认为,这篇文章就带你从不同的维度让二者进行一下 PK,看看到底怎么选择。
二、消息中间件选型
目前消息中间件比较多,比如 Kafka、RabbitMQ、ActiveMQ、RocketMQ、Pulsar 等,今天以 Kafka 和 RabbitMQ 为例来教你如何进行技术选型。
分别从以下5个纬度进行分析,功能纬度、性能纬度、可靠性和可用性纬度、运维管理、社区活跃度。
三、功能维度
衡量一款消息中间件是否符合要求,首先要考虑的就是其功能是否能满足自己的业务要求,这个直接决定了你是否会选择它。
3.1 顺序消费
RabbitMQ 对发送到队列或交换器的消息的顺序性提供了很少的保证。如果想在 RabbitMQ 中保证消息的顺序性也能做到,但是条件很苛刻,要求生产者和消费者都只有一个,这样生产者按顺序发送,消费者因为只有一个只能按顺序消费,这样就能保证消息的顺序,但是在实际中并不会这么干,毕竟现在都是分布式系统,要求系统的扩展性,没人会只有一个消费者,所以这个方案基本上只限于理论。
Kafka 在顺序消费方面给了很好的顺序保障。Kafka 生产者发送消息时指定Key,就能保障发往单分区消息的顺序性,每个消费组中的消费者消费时就能按顺序消费。
在顺序消费方面 Kafka 完胜 RabbitMQ,如果你的业务中消息需要按顺序消费,这时就需要使用 Kafka 了。
3.2 优先队列
优先级队列,顾名思义,具有高优先级的队列具有高的优先权,优先级高的消息具备优先被消费的特权。设置优先级队列,RabbitMQ 通过设置队列的属性设置成优先队列,设置如下:
Map<String, Object> args = new HashMap<>();
args.put("x-max-priority", 10);
Queue queue = new Queue(vodQueue, true, false, false, args);