为什么需要消息队列?

  • 异步处理
  • 流量控制
  • 服务解耦

该如何选择消息队列?

RabbitMQ 适合中小型公司,性能相对差点,但是用的人多。

当大量消息积压的时候,会导致 RabbitMQ 的性能急剧下降。不适合消息堆积。

RocketMQ 很在意响应时延。RocketMQ 的一个劣势是,作为国产的消息队列,相比国外的比较流行的同类产品,在国际上还没有那么流行,与周边生态系统的集成和兼容程度要略逊一筹。

Kafka 并不会立即发送出去,而是要等一会儿攒一批再发送,在它的 Broker 中,很多地方都会使用这种“先攒一波再一起处理”的设计。当你的业务场景中,每秒钟消息数量没有那么多的时候,Kafka 的时延反而会比较高。所以,Kafka 不太适合在线业务场景。适合在大数据和流计算领域,和日志系统。

主题和队列有什么区别?

RabbitMQ 的消息模型

rabbitmq 其实是队列模型,消息靠exchange(交换机)路由。 也支持发布订阅模型。(1对多)

RocketMQ 的消息模型

生成和消费确认机制

每个主题包含多个队列,通过多个队列来实现多实例并行生产和消费。需要注意的是,RocketMQ 只在队列上保证消息的有序性,主题层面是无法保证消息的严格顺序的。

消费组中包含多个消费者,同一个组内的消费者是竞争消费的关系,每个消费者负责消费组内的一部分消息。如果一条消息被消费者 Consumer1 消费了,那同组的其他消费者就不会再收到这条消息。

producer会往所有队列发消息,但不是“同一条消息每个队列都发一次”,每条消息只会往某个队列里面发送一次。

对于一个消费组,每个队列上只能串行消费,多个队列加一起就是并行消费了,并行度就是队列数量,队列数量越多并行度越大,所以水平扩展可以提升消费性能。

每队列每消费组维护一个消费位置(offset),记录这个消费组在这个队列上消费到哪儿了。

按照订单ID或者用户ID,用一致性哈希算法,计算出队列ID,指定队列ID发送,这样可以保证相同的订单/用户的消息总被发送到同一个队列上,就可以确保严格顺序了。