消息队列的发布订阅原理

蕴意非浅 3个月前 已收到2个回答 举报

好人再见 2星

共回答了24个问题采纳率:90.7% 评论

消息队列的发布-订阅(Publish-Subscribe)模式是一种常见的消息通信模式,它解耦了消息发布者和消息订阅者之间的直接联系。在发布-订阅模式中,消息发布者(Publisher)将消息发送到一个中心化的消息队列(Message Queue),而消息订阅者(Subscriber)则从队列中订阅感兴趣的消息。下面是发布-订阅模式的基本原理:

1. 发布者发布消息:发布者负责创建并发布消息到消息队列。消息可以是任意类型的数据,例如文本、JSON 对象等。

2. 队列存储消息:消息队列作为中间件,接收并存储发布者发布的消息。它可以是内存队列(如 Redis 的 Pub/Sub 功能)或持久化消息队列(如 RabbitMQ、Apache Kafka 等)。

3. 订阅者注册订阅:订阅者注册对特定类型或主题的消息感兴趣,并订阅这些消息。订阅者可以选择接收所有消息或只关注特定的消息类型。

4. 队列分发消息:当有新的消息发布到队列时,消息队列会将消息广播给已经注册订阅的订阅者。每个订阅者会接收到符合其订阅条件的消息。

5. 订阅者处理消息:订阅者接收到消息后,根据业务逻辑进行处理。处理可以是消费消息、进行计算、存储到数据库等操作。

通过发布-订阅模式,消息发布者无需知道消息订阅者的存在和身份,而消息订阅者也不需要和消息发布者直接通信。这种解耦的设计使得系统更灵活、可伸缩,并支持多对多的消息通信模式。

在实际应用中,发布-订阅模式可以应用于各种场景,如实时数据同步、事件驱动架构、分布式系统通信等。不同的消息队列实现可能有不同的特性和使用方法,但基本的发布-订阅原理是相通的。

13小时前

2

我等你 2星

共回答了282个问题 评论

订阅原理就是不同系统之间的重合性。Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

点对点与发布订阅最初是由JMS定义的。这两种模式主要区别或解决的问题就是发送到队列的消息能否重复消费(多订阅)

1、定义

JMS规范目前支持两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic)。

1.1、点对点:Queue,不可重复消费

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

1.2、发布/订阅:Topic,可以重复消费

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


支持订阅组的发布订阅模式:
发布订阅模式下,当发布者消息量很大时,显然单个订阅者的处理能力是不足的。实际上现实场景中是多个订阅者节点组成一个订阅组负载均衡消费topic消息即分组订阅,这样订阅者很容易实现消费能力线性扩展。可以看成是一个topic下有多个Queue,每个Queue是点对点的方式,Queue之间是发布订阅方式。

2、区别

2.1、点对点模式

生产者发送一条消息到queue,一个queue可以有很多消费者,但是一个消息只能被一个消费者接受,当没有消费者可用时,这个消息会被保存直到有 一个可用的消费者,所以Queue实现了一个可靠的负载均衡。

2.2、发布订阅模式

发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到这个消息的拷贝。

3、流行模型比较

传统企业型消息队列ActiveMQ遵循了JMS规范,实现了点对点和发布订阅模型,但其他流行的消息队列RabbitMQ、Kafka并没有遵循JMS规范。

3.1、RabbitMQ

RabbitMQ实现了AQMP协议,AQMP协议定义了消息路由规则和方式。生产端通过路由规则发送消息到不同queue,消费端根据queue名称消费消息。
RabbitMQ既支持内存队列也支持持久化队列,消费端为推模型,消费状态和订阅关系由服务端负责维护,消息消费完后立即删除,不保留历史消息。(1)点对点
生产端发送一条消息通过路由投递到Queue,只有一个消费者能消费到。


(2)多订阅
当RabbitMQ需要支持多订阅时,发布者发送的消息通过路由同时写到多个Queue,不同订阅组消费不同的Queue。所以支持多订阅时,消息会多个拷贝。

3.2、Kafka

Kafka只支持消息持久化,消费端为拉模型,消费状态和订阅关系由客户端端负责维护,消息消费完后不会立即删除,会保留历史消息。因此支持多订阅时,消息只会存储一份就可以了。但是可能产生重复消费的情况。(1)点对点&多订阅
发布者生产一条消息到topic中,不同订阅组消费此消息。

11小时前

32
可能相似的问题

猜你喜欢的问题

热门问题推荐

Copyright © 2024 微短问答 All rights reserved. 粤ICP备2021119249号 站务邮箱 service@wdace.com