消息总线和消息队列区别?
消息总线包含多个消息队列,即接收到所有消息,内部逻辑决定推送到哪个消息队列。
消息队列的发布订阅原理?
订阅的原理是不同系统之间的重合。Java消息服务(JMS)应用程序接口是Java平台上关于消息中间件(MOM)的API,用于在两个应用程序之间或分布式系统中发送消息以进行异步通信。
对等订阅和发布订阅最初是由JMS定义的。两种模式的主要区别或者说要解决的问题是,发送到队列的消息是否可以重复消费(多订阅)。
1.定义
JMS规范目前支持两种消息模型:点对点(队列)和发布/订阅(主题)。
1.1.点对点:队列,不能重复消费。
消息生产者产生消息并将其发送到队列,然后消息消费者将消息从队列中取出并使用它们。
消息被消费后,队列中没有存储,所以消息消费者不可能消费已经消费的消息。队列支持多个使用者的存在,但是只有一个使用者可以使用一条消息。
1.2.发布/订阅:话题,可以反复消费。
消息生产者(发布者)将消息发布到主题,同时,多个消息消费者(订阅者)消费该消息。与对等模式不同,发布到主题的消息将由所有订阅者使用。
支持订阅组的发布-订阅模式:
在发布-订阅模式下,当发布者的消息量较大时,单个订阅者的处理能力明显不足。实际上,在真实场景中,多个订阅者节点组成一个订阅群来负载均衡话题消息的消费,即群订阅,这样订阅者就可以轻松实现消费力的线性膨胀。可以看到,一个主题下有多个队列,每个队列都是点对点的,队列都是发布订阅的。
2.差异
2.1.点对点模式
生产者向队列发送消息。一个队列可以有许多消费者,但是一条消息只能被一个消费者接受。当没有可用的消费者时,消息将被保存直到有可用的消费者,因此队列实现了可靠的负载平衡。
2.2.发布-订阅模式
发布者向主题发送的消息将仅由订阅主题的订阅者接收。话题实现发布和订阅。当您发布消息时,订阅该主题的所有服务都可以获得该消息,因此1到n个订阅者可以获得该消息的副本。
3.热门车型对比
传统的企业消息队列ActiveMQ遵循JMS规范,实现点对点。点和发布订阅模型,但是其他流行的消息队列RabbitMQ和Kafka不遵循JMS规范。
3.1、RabbitMQ
RabbitMQ实现了AQMP协议,该协议定义了消息路由的规则和方法。生产者通过路由规则将消息发送到不同的队列,消费者根据队列名称消费消息。
RabbitMQ支持内存队列和持久队列,消费者是一个推模型。服务器负责维护消费状态和订阅关系,消费后立即删除消息,不保留历史消息。
(1)点对点
生产者通过路由向队列发送消息,只有一个消费者可以消费它。
(2)更多订阅
当RabbitMQ需要支持多个订阅时,发布者发送的消息通过路由同时写入多个队列,不同的订阅组消耗不同的队列。因此,当支持多个订阅时,消息将被复制多次。
3.2、卡夫卡
Kafka只支持消息持久化,消费者是拉模型,客户端负责维护消费状态和订阅关系。消息消费后,不会立即删除,但会保留历史消息。因此,当支持多个订阅时,将只存储一条消息。但是可能会有重复消费。
(1)点对点amp多订阅
发布者在主题中生成一条消息,不同的订阅组使用这条消息。