李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
消息队列中点对点与发布订阅区别
Leefs
2020-04-02 PM
2401℃
0条
# 消息队列中点对点与发布订阅区别 ### 一、JMS定义 JMS规范支持两种消息模型:点对点(point point,queue)和发布/订阅(publish/subscribe,topic)。 **1、点对点** 生产者生产消息发送到queue中,然后消费者从queue中取出并且消费消息。这里要注意:消息被消费以后,queue中不再有存储,所以消费者不可能消费到已经被消费的消息。 Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。 **2、发布/订阅** 生产者将消息发布到topic中,同时有多个消费者订阅该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。 ### 二、二者分析与区别 **1、点对点模式** ![消息队列中点对点与发布订阅区别01.png][1] 生产者发送一条消息到queue,只有一个消费者能收到 **2、发布订阅模式** ![消息队列中点对点与发布订阅区别02.png][2] 发布者发布到topic的消息,所有订阅了此topic的订阅者都会收到 **小结** queue实现了负载均衡,一条消息只能被一个消费者接收,当没有消费者可用时,这个消息会被保存直到有一个可用的消费者,一个queue可以有很多消费者,他们之间实现了负载均衡,所以Queue实现了一个可靠的负载均衡。topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到一个消息的拷贝 **疑问** 发布订阅模式下,能否实现订阅者负载均衡消费呢?当发布者消息量很大时,显然单个订阅者的处理能力是不足的。实际上现实场景中是多个订阅者节点组成一个订阅组负载均衡消费topic消息即分组订阅, 这样订阅者很容易实现消费能力线性扩展。 ![消息队列中点对点与发布订阅区别03.png][3] ### 三、 流行消息队列的消息模型比较 传统企业型消息队列ActiveMQ遵循了JMS规范,实现了点对点和发布订阅模型,但其他流行的消息队列RabbitMQ、Kafka并没有遵循老态龙钟的JMS规范,是通过什么方式实现消费负载均衡、多订阅呢? **1、RabbiMQ** RabbitMQ实现了AQMP协议,AQMP协议定义了消息路由规则和方式。生产端通过路由规则发送消息到不同queue,消费端根据queue名称消费消息。此外RabbitMQ是向消费推送消息,订阅关系和消费状态保存在服务端。 ![消息队列中点对点与发布订阅区别04.png][4] 生产端发送一条消息通过路由投递到Queue,只有一个消费者能消费到。 ![消息队列中点对点与发布订阅区别05.png][5] 当RabbitMQ需要支持多订阅时,发布者发送的消息通过路由同时写到多个Queue,不同订阅组消费此消息。 RabbitMQ既支持内存队列也支持持久化队列,消费端为推模型,,消息状态和订阅关系由服务端负责维护,消息消费完后立即删除,不保留历史消息。所以支持多订阅时,消息会多个拷贝。 **2、Kafka** ![消息队列中点对点与发布订阅区别06.png][6] Kafka只支持消息持久化,消费端为拉模型,消费状态和订阅关系由客户端端负责维护,消息消费完后不会立即删除,会保留历史消息。因此支持多订阅时,消息只会存储一份就可以了。 同一个订阅组会消费topic所有消息,每条消息只会被同一个订阅组的一个消费节点消费,同一个订阅组内不同消费节点会消费不同消息 *附:参考原文链接* *https://blog.csdn.net/lizhitao/article/details/47723105* [1]: https://lilinchao.com/usr/uploads/2020/04/2536135654.png [2]: https://lilinchao.com/usr/uploads/2020/04/2337061296.png [3]: https://lilinchao.com/usr/uploads/2020/04/2618664703.png [4]: https://lilinchao.com/usr/uploads/2020/04/4014505780.png [5]: https://lilinchao.com/usr/uploads/2020/04/2424958431.png [6]: https://lilinchao.com/usr/uploads/2020/04/3930592830.png
标签:
SpringCloud
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/783.html
上一篇
MySQL存储过程学习笔记
下一篇
RabbitMQ初步学习(一)
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
链表
栈
Filter
数据结构和算法
pytorch
MyBatis-Plus
Golang
Map
Kafka
Spark RDD
DataWarehouse
排序
国产数据库改造
二叉树
哈希表
Flume
JavaWEB项目搭建
Stream流
数据结构
Spark Core
Netty
Git
算法
数学
Java工具类
工具
SpringCloudAlibaba
并发编程
Redis
Thymeleaf
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭