消息模型: 主题和队列有什么区别

理解消息队列:队列与主题的区别 如果你研究过多种消息队列产品,可能会发现每种消息队列都有自己的一套消息模型,像队列(Queue)、主题(Topic)或分区(Partition)这些名词概念在不同的消息队列模型中含义各异。这是因为没有统一的标准。尽管曾有国际组织尝试制定过消息相关的标准,如早期的 JMS 和 AMQP,但这些标准的进化跟不上消息队列的演进速度,最终被淘汰了。那么,什么是队列?什么是主题?它们之间有什么区别?为了彻底理解这些概念,我们需要从消息队列的演进说起。 阅读详情

消息模型的演进

1. 消息队列,最初架构上,就是一个严格FIFO的结构。

消费者 <——接收—— 队列 <——发送—— 生产者

消费者出队操作,删除数据,生产者入队操作。服务端存储消息的地方叫队列。

若有多个生产者,则多生产者自然顺序投递消息到队列。若有多消费者,他们之间则是竞争关系。

若希望消息给每个消费者,即每个消费者都要获取全量消息,比如订单给风控,客服等。

不能采用生产者根据消费者数量复制消息到多队列的做法,浪费存储资源且生产和消费就耦合了。

2.消息队列就演化出发布-订阅模型 (Publish-Describe Pattern)

                               

                                |————订阅——|

发布者 —发布—> 主题  —接收—>  订阅者

                                |      —接收—>  订阅者

                                |————订阅——|

在发布-订阅模型中,消息的发送方是发布者,接收方式订阅者,存储消息的容器叫主题。订阅可以认为是主题在消费时的逻辑副本。

队列模型和发布订阅模型历史上并存,二者最大区别在于一份消息能否被消费多次,现代大多是后者,因为后者功能上兼容前者。

RabbitMQ的消息模型

RabbitMQ是少数仍在使用队列模型的流行产品之一。通过额外的exchange模块去完成消息投放到多队列,以实现多消费者消费。

生产者把消息投递给exchange,exchange基于配置策略决定投递到哪些队列。

RocketMQ的消息模型

RocketMQ是标准的发布-订阅模型(发布者-主题-订阅者)。但是RocketMQ也有队列概念。

起源在于消息队列的生产&消费机制,所有消息队列都用的"请求-确认"机制。

具体就是生产者发送消息到服务端(broker),服务端收到消息后,将消息写入主题或者队列中,并给生产者发送确认的响应。生产者没收到ack就会重试。

消费者收到消息并完成业务逻辑后会返回给服务端消费成功的确认,服务端收到ack认为消息被成功消费,否则会给消费者重发消息直到收到消费端ack。

保证了可靠性,但是对于服务端消息存储容器来说(主题),其中一条被消费前,下一条不会被消费,一定是被有序消费。

因此不可能出现一个主题,一个订阅者可以多个消费端并行消费的情况(服务端不能同时投递)。

为了解决这个问题,每个主题内包含多队列,多队列实现多实例并行生产和消费。队列内有序,主题层面不保证有序。

RocketMQ中的订阅者是消费组Consumer Group。各消费组订阅主题,消费进度独立。

组内则包含多个消费者(提升消费能力),消费者是竞争主题内消息的关系,即一条消息被消费者1消费后组内其他消费者不会再收到。

由于是发布-订阅模型,因此不能消费后删除主题内的消息,而是为每个订阅者(消费组)记录了在主题内每个队列上的offset。

Kafka的消息模型

与rocktmq完全一致,包括生产消费过程中的确认机制。

唯一区别是rocketmq的队列在kafka中被称作分区partition。含义和功能没有区别。

小结

主题和队列对应两个不同的消息模型:队列模型和发布-订阅模型。本质上二者可以变化和拓展来互相替代。

常用消息队列,RabbitMQ是队列模型,但其可以实现发布-订阅模型;kafka和RMQ都是发布-订阅者模型。

本节所说全部都是业务模型,类比关系数据库,业务模型都是二维表,但实现模型MySQL是B+树、HBase是KV结构存储。Kafka和RMQ也一样实现会不同。

思考:如果允许消息空洞,不要求严格有序,如何提升主题的消费能力?

【问题解决】Python 运行报错 `ModuleNotFoundError` 全网最全解决方案,一文搞定所有导包问题 本文全面解析Python中常见的ModuleNotFoundError和ImportError问题,提供从基础到高级的解决方案。文章首先分析问题原因,包括模块未安装、环境不一致、路径问题等,然后给出7种解决方案:安装缺失模块、检查Python环境、使用虚拟环境、添加搜索路径、相对导入、setup.py安装本地包和使用__init__.py。针对Jupyter Notebook、Docker容器等常见场景提供专门解决方案,并推荐使用requirements.txt、pipenv等预防措施。最后分享调试技巧,帮 阅读详情

相关推荐

Unity游戏开发实战:用柏林噪声打造3D随机地形(附完整C#代码)

本文详细介绍了如何在Unity游戏开发中使用柏林噪声算法生成3D随机地形,包含完整的C#代码实现。从基础柏林噪声原理到高级参数控制,再到性能优化和常见问题解决,帮助开发者掌握程序化地形生成技术,打造丰富多变的游戏世界。

weixin_29281941的博客 99

架构训练营-设计消息队列存储消息数据的表格

消息队列

xsh5161的博客 483

nRF52811墨水屏时钟DIY:从全刷到局刷的实战改造指南(附完整代码)

本文详细介绍了如何将基于nRF52811的墨水屏时钟从耗电的全屏刷新模式改造为高效的局部刷新模式。通过剖析全刷与局刷的原理差异,提供了从工程架构、驱动层适配到应用层逻辑重构的完整实战指南,并附上关键代码示例。改造后,设备功耗显著降低,续航大幅提升,同时解决了视觉闪烁问题,是DIY低功耗墨水屏应用的实用参考。

weixin_29194693的博客 352

游戏AI集成实战:基于DeepSeek API构建《光·遇》智能交互原型

大语言模型(LLM)作为人工智能领域的核心技术,通过深度学习海量文本数据,掌握了强大的自然语言理解和生成能力。其原理基于Transformer架构,通过自注意力机制捕捉长距离语义依赖,实现上下文感知的文本生成。这一技术价值在于能够将通用语言能力程序化调用,为各类应用注入智能交互潜力。在游戏开发领域,LLM的API接口为创建动态叙事、智能NPC和个性化体验提供了新范式。通过将游戏事件映射为结构化提示词,开发者可以构建能够理解游戏上下文并生成情境化响应的AI代理。本文以《光·遇》为应用场景,详细演示了如何通过F

weixin_30263277的博客 440

Codex接入CCSwitch:本地代理与模型路由配置指南

在AI编程工具链中,本地代理与模型路由是连接智能体与模型服务的核心桥梁。Codex作为OpenAI推出的编程智能体,虽然具备强大的仓库理解和自主编码能力,但其默认模型链路固定,导致在多模型切换、内网统一管理及成本控制上存在天然瓶颈。CCSwitch正是为解决这一痛点而生的本地代理工具,它通过OpenAI兼容协议将Codex的请求透明转发至DeepSeek、通义千问等第三方模型服务,使模型切换如同点击按钮般简单。本文从本地代理和模型路由器的基础原理切入,系统讲解Codex与CCSwitch的安装配置、模型ID

weixin_33910460的博客 427

Jetson Nano(1)——笔记本电脑控制

笔记本电脑控制Jetson Nano没有显示屏如何控制Jetson Nano一、使用ssh客户端连接到Jetson Nano的命令端1.将电脑的网线口和jetson nano的网线口通过网线连接2.在控制面版中打开“更改配适器设置”3.查找jetson nano的ip地址4.利用putty链接二、远程桌面配置 没有显示屏如何控制Jetson Nano Jetson Nano相当于一个微型电脑,能快...

weixin_43619070的博客 1万+

分布式开发之消息队列中,主题和队列有什么区别

总的来说,主题和队列是消息队列中的两个重要概念,主题用于将消息分类并标记,队列用于存储和管理已发布但尚未被订阅者处理的消息。例如,在一个名为“订单系统”的应用程序中,可能有多个主题,如“订单创建”、“订单更新”、“订单删除”等,发布者可以根据不同的主题发布不同的消息,订阅者可以根据自己感兴趣的主题来订阅相关的消息。例如,在一个名为“消息中心”的应用程序中,可能有多个队列,如“邮件队列”、“短信队列”、“推送队列”等,发布者可以将不同类型的消息发送到不同的队列中,订阅者从队列中获取相应的消息并进行处理。

xcksj666的博客 496

渗透测试自学日志之漏洞复现篇:漏洞列表

复现成功的漏洞列表,有复现方式,各位可以参考。 网络安全,人人有责,使用本文进行非法活动,与本人无关

maverickpig的博客 2174

消息与消息队列

    About Messages and Message Queues 基于windows的应用程序是事件驱动的。它们不进行明确的函数调用(比如调用C运行库)来获得输入。取而代之的是他们等待操作系统将输入传递给他们。 操作系统传递所有的输入给各种应用程序。每个window有一个函数叫做窗口过程,只要有输入操作系统就调用他们。窗口过程处理输入后,将控制返回给操作系统。详细资料请看窗口过程。

bluecrest的专栏 4080

C# 上位机程序中的数据采集与存储技术:从采集到持久化的完整解决方案

本文系统讲解C#上位机程序如何实现设备数据采集与持久化。主要内容包括:1)多种数据采集方式(串口通信、Modbus、OPC等)及代码示例;2)详细对比不同存储技术(CSV、SQLite、关系型数据库等)的优缺点;3)提供SQLite等存储实现代码;4)推荐分层系统架构(采集-缓存-存储-可视化);5)性能优化建议(多线程采集、异步存储、批量写入等)。文章强调应根据项目需求选择合适的技术方案,构建高效稳定的数据采集存储闭环系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1025

小梅哥Xilinx FPGA学习笔记15——基于SPI接口的ADC芯片驱动

ADC(Analog to Digital Conver),通常是指一个将转变为数字信号(二进制表示的离散信号)的转换器。先将输入模拟电压转换成时间或频率,再把中间量转换成数字量双积分型 ADC,先对输入采样电压和基准电压进行两次积分,获得与采样电压平均值成正比的时间间隔,同时用计数器对标准时钟脉冲计数。抗干扰能力强,稳定性好,但转换速度低。①并联比较型 ADC,采用各量级同时并行比较,各位输出码也是同时并行产生,转换速度快。缺点是成本高、功耗大。

m0_51430584的博客 5502

消息模型:主题和队列有什么区别?

这节课我们来学习消息队列中像队列、主题、分区等基础概念。这些基础的概念,就像我们学习一门编程语言中的基础语法一样,你只有搞清楚它们,才能进行后续的学习。如果你研究过超过一种消息队列产品,你可能已经发现,每种消息队列都有自己的一套消息模型,像队列(Queue)、主题(Topic)或是分区(Partition)这些名词概念,在每个消息队列模型中都会涉及一些,含义还不太一样。为什么出现这种情况呢?因为没有标准。曾经,也是有一些国际组织尝试制定过消息相关的标准,比如早期的JMS和AMQP。

qq_33240556的博客 881

Python爬虫实战:用Playwright+Transformer做财经新闻事件驱动分析,我靠它抓住了算力政策的涨停机会

对我来说,这套系统最大的价值不是抓住了几次涨停,而是把“看新闻→分析→决策”的全流程自动化、量化了——不用再被股吧的情绪带偏,不用再熬夜刷新闻,而是用数据和模型做理性判断。更重要的是,搭建这套系统的过程,我吃透了Playwright动态爬虫、Transformer文本分析、量化数据对接这些核心技能,这些技能不管是做量化、做数据分析师,还是做其他领域的爬虫,都能用得上。现在打开PyCharm,跟着代码跑一遍,你也能从海量财经新闻里,挖出属于自己的事件驱动信号——与其靠感觉炒股,不如靠数据说话。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1391

03 | 消息模型:主题和队列有什么区别?

这节我们来学习消息队列中像队列、主题、分区等基础概念。这些基础的概念,就像我们学习一门编程语言中的基础语法一样,只有搞清楚它们,才能进行后续的学习。如果你研究过超过一种消息队列产品,你可能已经发现,每种消息队列都有自己的一套消息模型,像队列(Queue)、主题(Topic)或是分区(Partition)这些名词概念,在每个消息队列模型中都会涉及一些,含义还不太一样。为什么出现这种情况呢?因为没有标准。曾经,也是有一些国际组织尝试制定过消息相关的标准,比如早期的 JMS 和 AMQP。

qq_37756660的博客 1101

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

消息模型:主题和队列的区别

一、消息队列的演进 1、初始阶段 最初的消息队列,就是一个严格意义上的队列。队列是一种数据结构,先进先出,在消息入队出队过程中,保证这些消息严格有序。早期的消息队列就是按照“队列”的数据结构设计的。 队列模型: 生产者(Producer)发消息就是入队操作,消费者(Consumer)收消息就是出队也就是删除操作,服务端存放消息的容器自然就称为“队列”。 如果有多个...

weixin_30507481的博客 269

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

rocketmq订阅多个主题_消息模型:主题和队列有什么区别?

首发公众号:码农架构可以看到,技术圈的风向一直在变,大数据、云的热度已经在慢慢消退,现在当红的是 AI 和 IoT。这些火热的概念,它最终要从论文和 PPT 落地,变成真正能解决问题的系统,否则就是一个空中楼阁。那不变的是什么?(一些题外话的感触)主题和队列有什么区别?最初的消息队列,就是一个严格意义上的队列消费者之间实际上是竞争的关系,每个消费者只能收到队列中的一部分消息如果需要将一份消息数据分...

weixin_30551437的博客 2158

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

消息队列_03(消息模型: 主题和队列有什么区别)

消息模型: 主题和队列有什么区别 1.区别 队列是一种数据结构,有完整而严格的定义。 队列: 先进先出 注: 多个生产者发送信息为所有消息合集,顺序为生产者发送消息的自然顺序。 多个消费者时,任何一条消息只能被一个消费者收到 多个消费者需要共享一个消息,演化出“发布-订阅模型” 注:队列和发布-订阅模型最大区别就是一份消息数据能不能被消费多次的问题 2. RabbitMQ的消息模型 依然使用队...

qq_21486655的博客 513

消息队列 策略_消息模型:主题和队列有什么区别?

首发公众号:码农架构可以看到,技术圈的风向一直在变,大数据、云的热度已经在慢慢消退,现在当红的是 AI 和 IoT。这些火热的概念,它最终要从论文和 PPT 落地,变成真正能解决问题的系统,否则就是一个空中楼阁。那不变的是什么?(一些题外话的感触)主题和队列有什么区别?最初的消息队列,就是一个严格意义上的队列消费者之间实际上是竞争的关系,每个消费者只能收到队列中的一部分消息如果需要将一份消息数据分...

weixin_39626131的博客 136

系统学习消息队列分享(四) 消息模型:主题和队列有什么区别?

这节课我们来学习消息队列中像队列、主题、分区等基础概念。这些基础的概念,就像我们学习一门编程语言中的基础语法一样,你只有搞清楚它们,才能进行后续的学习。 如果你研究过超过一种消息队列产品,你可能已经发现,每种消息队列都有自己的一套消息模型,像队列(Queue)、主题(Topic)或是分区(Partition)这些名词概念,在每个消息队列模型中都会涉及一些,含义还不太一样。 为什么出现...

weixin_30586085的博客 512
上一篇: 01 | 为什么要消息队列
下一篇: 04 | 利用事务消息实现分布式事务
vectorX
博客等级 码龄11年 37粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值