主题和队列的区别

混江龙づ霸主 提交于 2020-02-05 01:30:04

队列模式

发布-订阅模式:发布者、主题、订阅者

RabbitMQ

基于队列模式,可以使用Exchange实现发布-订阅模式

rabbitmq官方的六种工作模式

六种工作模式的主要特点:

简单模式:

一个生产者,一个消费者。生产者将消息发送到队列,消费者从队列中获取消息。

 

 

work模式:

一个生产者,多个消费者,每个消费者获取到的消息唯一。

 

订阅模式:

一个生产者发送的消息会被多个消费者获取。一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费

路由模式:

发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key

topic模式:将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词。

 

消费者从队列中获取消息,服务端如何知道消息已经被消费呢?

模式1:自动确认

只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。

模式2:手动确认

消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。

 

消息队列的消费机制

消息队列的消费机制:"请求-确认",保证了消息传递过程中的可靠性。

生产者先将消息发送给服务端(主题),服务端在收到消息并将消息写入主题或者队列中后,会给生产者发送确认的响应,否则重发。

在消费端,消费者在收到消息并完成自己的消费业务逻辑,也会给服务端发送消费成功的确认,服务端只有收到消费确认后,才认为一条消息被成功消费,否则重发。

问题:但为了确保消息的有序性,在某一条消息被成功消费之前,下一条消息不能被消费,否则就会出现消息空洞(?),违背了有序性这个原则。导致每个主题在任意时刻至多只有一个消费者实例在消费,无法通过水平扩展消费者的数量来提升总体消费能力。

解决办法:RocketMQ让每个主题包含多个队列,通过多个队列来实现多实例的并行生产和消费。

RocketMQ

同一消费组中的多个消费者是竞争关系,每个辅助消费组中的一部分消息。不同组之间的消费进度互不影响。如果一条消息被消费者 Consumer1 消费了,那同组的其他消费则不会再收到这条消息。

Topic的消费过程中,因为消息会被不同的组进行多次消费,所以消费完的消息不会立即删除,而是为每个消费组在每个队列上维护一个消费位置。每队列每消费组维护一个消费位置(offset),记录这个消费组在这个队列上消费到哪儿了。

每个消费组内部维护自己的一组消费位置,每个队列对应一个消费位,每个队列对应一个消费位置。消费位置在服务端保存,并且,消费位置和消费者是没有关系的。

由于消费确认机制的限制,这里面有一个原则是,在同一个消费组里,每个队列只能被一个消费者实例占用,一个消费者可以占用多条队列,一个消费者宕机了,会触发重新分配。

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

Kafka

Kafka 的消息模型和 RocketMQ 是完全一样的

RabbitMQ教程

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!