一, 队列模型
我们常用的的生产者 - 消费者模式, 生成者生成消息, 消费者消费已有的消息. 消息队列一开始也是使用这种模式称之为队列模型, 生产者将消息投递到消息队列中, 消费者从消息队列中取出消息, 而消息就是已队列的结构存放在消息队列中. 但这种模型有个缺点, 当这个消息需要被多个消费者消费的时候, 需要生产者发送同一条消息到不同的队列, 不同的消费者到不同队列上消费到消息. 现在比较多的发布 - 订阅模型.
二, 发布 - 订阅模型
发布者发布消息到主题中, 消费者需要提前订阅该主题, 就可以接收到发送到这个主题上的消息了. 发布者就是之前队列模型的生产者, 主题就是队列, 订阅者就是之前的消费者.
这样子一条消息需要被多个订阅者消费到就都订阅这个主题就可以了, 不需要复制到多个队列上浪费资源.
现在又有一个新问题, 主题中的消息为了保证有序性, 同一时刻只能有一个订阅者消费, 串行效率很低, 如何解决这个问题呢?
三, 不同 MQ 使用的模型
RocketMQ 使用的是发布 - 订阅模型. 为了解决上述问题, 引入了队列, 将主题中的消息分散到不同队列中, 这样就可以并行的消费了.
Kafka 和 RocketMQ 差不多, 只是队列换了一个名称为分区, 也是使用的发布 - 订阅模型.
而 RabbitMQ 使用的是队列模型, 但为了解决多个消费者的问题, 引入了 exchange 的概念. 同一个消息需要被多个消费者消费, 则在 exchange 中配置多个路由, 路由到不同队列上.
来源: http://www.bubuko.com/infodetail-3395517.html