个人建设门户网站 如何备案,网页布局的几种方法,seo查询工具,lnmp一键安装搭建wordpress消息模型#xff1a;主题和队列有什么区别#xff1f;
两类消息模型
早期的消息队列#xff0c;就是按照“队列”的数据结构来设计的。 生产者#xff08;Producer#xff09;发消息就是入队操作#xff0c;消费者#xff08;Consumer#xff09;收消息就是出队也就是…消息模型主题和队列有什么区别
两类消息模型
早期的消息队列就是按照“队列”的数据结构来设计的。 生产者Producer发消息就是入队操作消费者Consumer收消息就是出队也就是删除操作服务端存放消息的容器自然就称为“队列”。这就是最初的一种消息模型队列模型。 如果有多个生产者往同一个队列里面发送消息这个队列中可以消费到的消息就是这些生产者生产的所有消息的合集。消息的顺序就是这些生产者发送消息的自然顺序。如果有多个消费者接收同一个队列的消息这些消费者之间实际上是竞争的关系每个消费者只能收到队列中的一部分消息也就是说任何一条消息只能被其中的一个消费者收到。 为了解决这个问题演化出了另外一种消息模型“发布-订阅模型Publish-Subscribe Pattern”。 在发布 - 订阅模型中消息的发送方称为发布者Publisher消息的接收方称为订阅者Subscriber服务端存放消息的容器称为主题Topic。发布者将消息发送到主题中订阅者在接收消息之前需要先“订阅主题”。“订阅”在这里既是一个动作同时还可以认为是主题在消费时的一个逻辑副本每份订阅中订阅者都可以接收到主题的所有消息。
RabbitMQ 的消息模型
RabbitMQ 是少数依然坚持使用队列模型的产品之一。 它是怎么解决多个消费者的问题呢 在 RabbitMQ 中Exchange 位于生产者和队列之间生产者并不关心将消息发送给哪个队列而是将消息发送给 Exchange由 Exchange 上配置的策略来决定将消息投递到哪些队列中。同一份消息如果需要被多个消费者来消费需要配置 Exchange 将消息发送到多个队列每个队列中都存放一份完整的消息数据可以为一个消费者提供消费服务。
RocketMQ 的消息模型
RocketMQ 使用的消息模型是标准的发布-订阅模型。 在生产端生产者先将消息发送给服务端也就是 Broker服务端在收到消息并将消息写入主题或者队列中后会给生产者发送确认的响应。如果生产者没有收到服务端的确认或者收到失败的响应则会重新发送消息。在消费端消费者在收到消息并完成自己的消费业务逻辑后也会给服务端发送消费成功的确认服务端只有收到消费确认后才认为⼀条消息被成功消费否则它会给消费者重新发送这条消息直到收到对应的消费成功确认。 每个主题在任意时刻至多只能有一个消费者实例在进行消费那就没法通过水平扩展消费者的数量来提升消费端总体的消费性能。为了解决这个问题RocketMQ 在主题下面增加了队列的概念。 每个主题包含多个队列通过多个队列来实现多实例并行生产和消费。RocketMQ 只在队列上保证消息的有序性主题层面是无法保证消息的严格顺序的。 RocketMQ 中订阅者的概念是通过消费组Consumer Group来体现的。 每个消费组都消费主题中一份完整的消息不同消费组之间消费进度彼此不受影响。消费组中包含多个消费者同一个组内的消费者是竞争消费的关系每个消费者负责消费组内的一部分消息。 在 Topic 的消费过程中由于消息需要被不同的组进行多次消费所以消费完的消息并不会立即被删除这就需要 RocketMQ 为每个消费组在每个队列上维护一个消费位置 Consumer Offset这个位置之前的消息都被消费过之后的消息都没有被消费过每成功消费一条消息消费位置就加一。
Kafka 的消息模型
Kafka 的消息模型和 RocketMQ 是完全一样的。唯一的区别是在 Kafka 中队列这个概念的名称不一样Kafka 中对应的名称是“分区Partition”含义和功能是没有任何区别的。