当前位置: 首页 > news >正文

消息队列学习笔记(二)

文章目录

  • 如何设计一个消息队列
    • 组件设计
    • 持久化与集群设计
    • 注册中心
      • 注册中心的作用
    • 高可用设计
    • 关键特性实现
      • 可靠性
      • 延时性
      • 事务消息
    • 消息队列工作流程

如何设计一个消息队列

组件设计

上游任务发送一个消息到队列,下游服务监听队列消息,此时上游服务就是消息的生产者,下游服务就是消息的消费者,这种模式叫队列模式点对点模式。一个消息被发送到队列,然后多个消费者竞争消费,每个消息只能够被一个消费者处理,如果有多个消费者想消费同一个消息,那就只能复制多个队列,然后每个消费者都消费自己的队列。

问题来了,复制多个队列不仅浪费资源,而且队列和消费者强绑定了,那如果某个消费者不消费了,就要去掉对应的队列,这完全违背了解耦的目标。怎么办呢?

  • 可以让每个消费者都订阅某个主题,也就是topic,生产者把消息发送到这个topic,然后队列可以把收到的这个消息,发送给所有订阅了这个topic的消费者,这个叫主题模式或者发布订阅模式。消费者不再依赖队列了,而是订阅topic一个topic中可以有一个或多个队列,这样队列就可以随意的水平扩容。

  • 消息队列可能不止有一个topic,可能有多个topic,所以得在外面包一层来管理多个topic,这个就叫broker,生产者把消息发送到brokerbroker根据消息的topic放到对应的队列当中,然后消费者根据topic去获取消息。

持久化与集群设计

那么问题来了,把消息存内存里,他不是很安全,重启他就会丢失,所以broker收到消息之后,需要把收到的这个消息保存到磁盘里做持久化

那么问题又来了,如果说你的broker只有一个,那就会有单点故障问题,所以得做个主从,写消息只能写到broker的主节点,从节点只能用来读。从节点定期去从主节点同步数据,这与 MySQL 的读写分离、Redis 的主从架构简直一样。

那么问题又来了,broker主从存的数据是一样的,那每个broker所能承载的消息数量也是有上限的, 而且主节点并发写的能力也是具有瓶颈的,怎么办呢?

  • 部署多个主从节点,构成一个broker集群,然后把每个topic的队列和数据分散存储到不同的broker节点上,那这样集群里面不同的主节点都各自保存topic的部分数据,然后每个节点的压力就减少了。类似于 MySQL 的分库分表,Redis 的分片集群。

注册中心

那么问题又来了,那么多个broker,生产者发消息的时候,怎么知道应该发给哪个broker呢?消费者获取消息的时候,怎么知道应该从哪个broker中获取消息呢?

  • 所以这时候就需要一个注册中心,专门去管理broker集群。

注册中心的作用

  1. 保存集群的状态信息:通过broker定时去上报心跳,来实时感知这个节点上下线,确保这个请求不会达到一个故障节点
  2. 掌管消息路由:让生产者知道消息应该发送给哪个broker,让消费者知道应该从哪个broker去读取消息
  3. 负责集群的负载均衡、故障转移:为了保证注册中心的高可用,注册中心自身也得做集群。

高可用设计

  • 生产者: 通过注册中心感知 Broker 列表,根据 Key 做 Hash 保证局部有序,或轮询保证全局均衡。
  • 消费者组: 实现多实例并发消费。当成员变化时触发 Rebalance(重平衡)。
  • 借鉴 Kafka 的 ISR 机制。只有在 ISR 列表中的副本都写成功,才返回 ACK,平滑权衡可用性与可靠性。

关键特性实现

可靠性

  • 生产者: 等待 ACK 成功。
  • broker: 同步刷盘 + 多副本。
  • 消费者: 处理完业务手动提交 Offset。

延时性

建立时间轮多级延时队列(如 1s, 5s, 10s…)。到期后再投递到真实topic

事务消息

采用两阶段提交 (2PC) + 反查机制。先发半消息,本地事务执行完后再提交,失败则回滚。

消息队列工作流程

  • broker集群定期向注册中心去发送心跳包,上报自身消息。
  • 注册中心掌管了所有broker的节点信息和消息的路由信息,生产者要给某个topic发送消息的时候,通过访问注册中心,获取到某个topic的路由表,就能知道自己的消息应该发送给哪个broker的哪个队列,然后对应的broker的主节点收到消息后,同步消息给从节点,然后将消息持久化。
  • 消息的消费者访问注册中心,订阅对应的topic,就能够获取到这个topic的一个路由表,然后就能知道应该去哪个broker哪个队列里去拉取消息了。
http://www.jsqmd.com/news/611955/

相关文章:

  • March7thAssistant:崩坏星穹铁道全自动游戏解决方案
  • Linux中Netlink简介和使用总结
  • Cosmos-Reason1-7B应用场景:教育机器人‘为什么这个斜坡小车会滑下来’交互教学
  • Qwen3-TTS-12Hz-1.7B-VoiceDesign 长文本处理:10分钟语音生成稳定性测试
  • 阿里云代理商:百炼大模型技术解析与应用指南
  • 避坑指南:程序员转量化交易最容易踩的3个技术雷区(附解决方案)
  • Qwen3-ASR轻量级语音识别:RTX 3060即可运行,本地部署隐私无忧
  • 毕业快11年了,我仍是程序猿
  • ScriptCat脚本猫:让浏览器自动化成为你的超级助手
  • PicoXR与PicoOpenXR插件深度对比解析,在JavaScript / HTML中,实现`<iframe>` 自适应高度。
  • **金丝雀发布实战:基于Go语言的渐进式部署策略设计与实现**在现代微服
  • 设计师亲测:AI真能救命!用对工具,效率直接翻倍
  • 别再用for循环遍历DataFrame了!Polars 2.0表达式引擎5大高阶用法,清洗代码行数直降92%
  • 美国飞船 1.5 亿的太空厕所已瘫痪。NASA:小 bug。网友:和航母厕所同一家供应商么
  • 嵌入式C语言宏配置技巧与实战应用
  • 闲置盒马鲜生礼品卡如何变现?教你找到最安全的回收平台! - 团团收购物卡回收
  • 从入门到部署|2026年Koa全栈开发实战:覆盖Node.js、数据库、部署与云架构全链路
  • 避坑指南:在ROS Noetic下为TurtleBot3 Waffle模型安装Velodyne插件那些事儿
  • 2026-04-09 全国各地响应最快的 BT Tracker 服务器(联通版)
  • JAVA 四十条代码优化建议
  • Qwen3-ForcedAligner微调教程:使用自有语料提升垂直领域对齐精度
  • 软件测试用例智能生成与优先级排序:KART-RERANK的实践
  • wan2.1-vaeAI绘画工作台:集成提示词助手、参数记忆、历史图库管理功能
  • ONNX 是什么?一篇讲清楚大模型时代的“中间语言”
  • 抖音风控参数‘bd-ticket-guard-client-data’深度解析:从X.509证书到请求签名的完整链路
  • python的作用率
  • SDMatte API接口设计规范:构建企业级高可用图像处理服务
  • 领航数字金融新时代:为什么 OEX 交易所是我最信赖的资产避风港?
  • 智能售后工单分类:EcomGPT-7B+NLP多标签分类
  • Nano-Banana快速上手指南:5分钟完成首个产品平铺图生成