消息的主题和队列

Posted ityannic

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息的主题和队列相关的知识,希望对你有一定的参考价值。

一、队列模型

  我们常用的的生产者-消费者模式,生成者生成消息,消费者消费已有的消息。消息队列一开始也是使用这种模式称之为队列模型,生产者将消息投递到消息队列中,消费者从消息队列中取出消息,而消息就是已队列的结构存放在消息队列中。但这种模型有个缺点,当这个消息需要被多个消费者消费的时候,需要生产者发送同一条消息到不同的队列,不同的消费者到不同队列上消费到消息。现在比较多的发布-订阅模型。

 

二、发布-订阅模型

  发布者发布消息到主题中,消费者需要提前订阅该主题,就可以接收到发送到这个主题上的消息了。发布者就是之前队列模型的生产者,主题就是队列,订阅者就是之前的消费者。

      这样子一条消息需要被多个订阅者消费到就都订阅这个主题就可以了,不需要复制到多个队列上浪费资源。

技术图片

  

  现在又有一个新问题,主题中的消息为了保证有序性,同一时刻只能有一个订阅者消费,串行效率很低,如何解决这个问题呢?

 

三、不同MQ使用的模型

      RocketMQ使用的是发布-订阅模型。为了解决上述问题,引入了队列,将主题中的消息分散到不同队列中,这样就可以并行的消费了。

      Kafka和RocketMQ差不多,只是队列换了一个名称为分区,也是使用的发布-订阅模型。

      而RabbitMQ使用的是队列模型,但为了解决多个消费者的问题,引入了exchange的概念。同一个消息需要被多个消费者消费,则在exchange中配置多个路由,路由到不同队列上。

  

 

以上是关于消息的主题和队列的主要内容,如果未能解决你的问题,请参考以下文章

Python。如何从队列/主题 ActiveMQ 中删除任何消息

JMS 工作流 - 混合队列和主题

ActiveMQ之队列和主题发布订阅实例

我可以存储和读取来自 STOMP 队列/主题的消息吗?

RabbitMQ消息队列: 主题分发

如何使用 Java 将错误消息移动到 Azure 死信队列(主题 - 订阅)?