背景知识
JMS一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914)。2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1.1.
Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
点对点与发布订阅最初是由JMS定义的。这两种模式主要区别或解决的问题就是发送到队列的消息能否重复消费(多订阅)
1.JMS中定义
JMS规范目前支持两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic)。
点对点:
消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。这里要注意:
消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。
Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
发布/订阅
消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。
2.二者分析与区别
2.1 点对点模式
生产者发送一条消息到queue,只有一个消费者能收到。
2.2 发布订阅模式
发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。
小结
queue实现了负载均衡,一个消息只能被一个消费者接受,当没有消费者可用时,这个消息会被保存直到有 一个可用的消费者,一个queue可以有很多消费者,他们之间实现了负载均衡,
所以Queue实现了一个可靠的负载均衡。
topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到一个消息的拷贝,
只有在消息代理收到消息时有一个有效订阅时的订阅者才能得到这个消息的拷贝。
疑问
发布订阅模式下,能否实现订阅者负载均衡消费呢?当发布者消息量很大时,显然单个订阅者的处理能力是不足的。实际上现实场景中是多个订阅者节点组成一个订阅组负载均衡消费topic消息即分组订阅,
这样订阅者很容易实现消费能力线性扩展。
3 流行消息队列模型比较
传统企业型消息队列ActiveMQ遵循了JMS规范,实现了点对点和发布订阅模型,但其他流行的消息队列RabbitMQ、Kafka并没有遵循老态龙钟的JMS规范,是通过什么方式实现消费负载均衡、多订阅呢?
3.1 RabbitMQ
RabbitMQ实现了AQMP协议,AQMP协议定义了消息路由规则和方式。生产端通过路由规则发送消息到不同queue,消费端根据queue名称消费消息。此外RabbitMQ是向消费端推送消息,订阅关系和消费状态保存在服务端。
生产端发送一条消息通过路由投递到Queue,只有一个消费者能消费到。
当RabbitMQ需要支持多订阅时,发布者发送的消息通过路由同时写到多个Queue,不同订阅组消费此消息。
RabbitMQ既支持内存队列也支持持久化队列,消费端为推模型,消费状态和订阅关系由服务端负责维护,消息消费完后立即删除,不保留历史消息。所以支持多订阅时,消息会多个拷贝。
3.2 Kafka
Kafka只支持消息持久化,消费端为拉模型,消费状态和订阅关系由客户端端负责维护,消息消费完后不会立即删除,会保留历史消息。因此支持多订阅时,消息只会存储一份就可以了。
相关推荐
SpringBoot整合ActiveMQ消息队列和双向队列、点对点与发布订阅,可以参考我的博客文章进行学习https://blog.csdn.net/sujin_/article/details/82956386
消息队列:ActiveMQ:ActiveMQ消息类型:点对点与发布订阅.docx
JMS支持两种主要的消息传递模型:点对点(Point-to-Point, PTP)和发布/订阅(Publish/Subscribe, Pub/Sub)。这两种模型的核心区别在于消息如何被传递以及如何被接收。 #### 二、点对点(Point-to-Point, PTP) ...
在这个"ActiveMQ的点对点与发布/订阅模式小demo"中,我们将深入理解这两种基本的消息传递模型,并了解如何在实践中运用ActiveMQ。 1. **点对点模式(Point-to-Point,P2P)**: 点对点模式是基于队列(Queue)的...
在点对点模式下,生产者将消息发送到一个队列,消费者从该队列中接收并处理消息。这种模式的特点是: 1. 消息的一对一交付:每个消息仅被一个消费者接收,其他消费者无法获取该消息。 2. 排队机制:如果消费者无法...
在基于Redis的消息队列之发布订阅模式中,pom.xml文件用于配置Redis的依赖关系和版本号。 知识点五:redis.properties文件 redis.properties文件是Redis的配置文件,该文件用于配置Redis的连接参数,例如主机名、...
与点对点模型不同,发布/订阅模型支持一对多的消息传递,即一条消息可以被多个订阅者接收。 - **主题**:消息发布的中心,类似于广播电台,生产者向主题发布消息。 - **发布者**:向主题发布消息的应用程序。 - **...
3. **消息模型**:消息队列通常采用两种模型,即点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)。在点对点模型中,每个消息只有一个消费者;而在发布/订阅模型中,一个消息可以被多个消费者订阅。 4. *...
在发布-订阅模式中,消息发送者(生产者)发布消息,消息接收者(消费者)订阅消息,接收者无需知道消息来源,而只需关心自己感兴趣的消息类型。这种模式适合于构建松耦合的系统,可以实现服务的动态增减和消息的...
生产者发布消息到特定的队列,消费者订阅这个队列并处理接收到的消息。这种方式确保了消息的有序处理,适用于单个服务消费者的场景。 三、发布订阅通信模式 发布订阅模式则是一种一对多的通信模型,一个生产者发布...
该模型的特点包括多个发送者可向一个主题发布消息,多个接收者可使用同一主题中的消息,接收者可以处于活动或非活动状态,消息队列需要为非活动状态的接收者保留消息等。架构设计的角度来看,点对点模型实际上是发布...
在点对点模型中,消息由一个生产者发送到一个称为队列的特定目的地,然后由一个或多个消费者接收。每个消息只被一个消费者消费一次,确保数据的有序性和一致性。这种模型适用于一对一的通信场景,如订单处理或事务...
本篇文章将详细讲解如何在Qt应用程序中利用Redis来实现一个高效的消息队列,以实现点对点的生产者-消费者模式。 首先,我们需要了解Qt和Redis的基础知识。Qt是一个跨平台的C++图形用户界面库,它提供了丰富的API...
1. **点对点模式(point-to-point, queue)**:在这种模式下,每个消息只有一个消费者,消息一旦被消费就会从队列中删除。发送者和接收者之间没有直接依赖,发送者可以独立发送消息,而接收者可以在准备好时从队列中...
- **点对点模型**(Point-to-Point):每个消息只有一个消费者,常用于工作流处理。 - **发布/订阅模型**(Publish/Subscribe):多个消费者可以订阅同一主题,常用于广播通知。 4. 常见的消息队列产品: - **...
ActiveMQ提供了多种消息类型,包括点对点(Queue)和发布/订阅(Topic)模型。点对点模型中,每个消息只能被一个消费者接收;而在发布/订阅模型中,一个主题下的消息可以被多个订阅者接收,实现广播效果。 配置文件...
JMS提供两种消息模型:点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)。 最后,"Rabbit.zip"可能是指RabbitMQ,另一个非常流行的消息队列实现,它基于AMQP协议。RabbitMQ以其稳定性和易用性受到开发者...
4. **队列(Queue)**:队列是一种点对点的通信模型。每个消息仅被一个消费者接收,确保消息的顺序传递和至少一次传递(可能因重复消费而超过一次)。 5. **主题(Topic)**:主题支持发布/订阅模式,一个消息可以...
总结,Apache ActiveMQ提供了灵活的消息传递机制,支持点对点和发布/订阅模式,适用于各种分布式系统中的数据通信。通过理解并熟练掌握这两种模式的开发流程,开发者可以有效地构建和优化自己的应用程序。
- **点对点(P2P)**:每个消息只能被一个消费者接收。 - **发布/订阅(Pub/Sub)**:消息可以被多个订阅者接收。 - **请求/响应(Request/Response)**:发送消息方等待接收方的回应。 - **扇出(Fanout)**:将消息广播给...