1. 点对点
生产者生产消息发送到queue中,然后消费者从queue中取出并且消费消息。
这里要注意: 消息被消费以后,queue中不再有存储,所以消费者不可能消费到已经被消费的消息。
Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。

2. 发布/订阅
生产者将消息发布到topic中,同时有多个消费者订阅该消息。
和点对点方式不同,发布到topic的消息会被所有订阅者消费。

3. 流行消息队列的消息模型比较
3.1 RabbitMQ
RabbitMQ实现了AQMP协议,AQMP协议定义了消息路由规则和方式。生产端通过路由规则发送消息到不同queue,消费端根据queue名称消费消息。此外RabbitMQ是向消费端推送消息,订阅关系和消费状态保存在服务端。
生产端发送一条消息通过路由投递到Queue,只有一个消费者能消费到,如下如所示:

当RabbitMQ需要支持多订阅时,发布者发送的消息通过路由同时写到多个Queue,不同订阅组消费此消息。
RabbitMQ既支持内存队列也支持持久化队列,消费端为推模型,消费状态和订阅关系由服务端负责维护,消息消费完后立即删除,不保留历史消息。所以支持多订阅时,消息会多个拷贝。

3.2 Kafka
Kafka只支持消息持久化,消费端为拉模型,消费状态和订阅关系由客户端端负责维护,消息消费完后不会立即删除,会保留历史消息。因此支持多订阅时,消息只会存储一份就可以了。
同一个订阅组会消费topic所有消息,每条消息只会被同一个订阅组的一个消费节点消费,同一个订阅组内不同消费节点会消费不同消息

本文对比了两种流行的消息队列技术——RabbitMQ和Kafka的特性与工作方式。RabbitMQ基于AMQP协议,支持点对点与发布/订阅模式,消息消费后即删除。而Kafka支持消息持久化,消费状态由客户端维护,消息消费后仍保留历史记录。两者在多订阅支持、消息存储与消费模型上有着显著差异。
925

被折叠的 条评论
为什么被折叠?



