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

Rocketmq消息队列 消息模型 详解

消息队列模型

两种消息模型

队列模型

队列模型是最开始的一种消息队列模型,对应着消息队列“发-存-收”的模型。生产者往某个队列里面发送消息,一个队列可以存储多个生产者的消息,一个队列也可以有多个消费者,但是消费者之间是竞争关系,也就是说每条消息只能被一个消费者消费

在这里插入图片描述

发布/订阅模型

在发布-订阅模型中,消息的发送方称为发布者(Publisher),消息的接收方称为订阅者(Subscriber),服务端存放消息的容器称为主题(Topic)。发布者将消息发送到主题中,订阅者在接收消息之前需要先“订阅主题”。“订阅”在这里既是一个动作,同时还可以认为是主题在消费时的一个逻辑副本,每份订阅中,订阅者都可以接收到主题的所有消息。

RocketMQ 的消息模型

RocketMQ 使用的消息模型是标准的发布-订阅模型

RocketMQ 本身的消息是由下面几部分组成:

NameServer:

生产者,消费者,Broker都会在NameServer进行注册,并向NameServer发送心跳包,NameServer可搭建集群,但是节点之间不进行互相通讯,每个Broker与NameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer。

Broker:

消息存储与转发服务器,负责实际的消息读写、持久化、高可用同步。

接收消息,消息持久化,提供消息

Producer:

生产者,生产消息,向NameServer询问Broker地址,然后往Broker发送消息。Producer 与 NameServer 集群中的其中一个节点(如果这个节点挂了,就向其它节点建立连接,配置文件可以指定多个NameServer信息)建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Master 建立长连接,且定时向 Master 发送心跳。Producer 完全无状态。

Consumer:

Consumer 与 NameServer 集群中的其中一个节点建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Master、Slave 建立长连接,且定时向 Master、Slave发送心跳。Consumer 既可以从 Master 订阅消息,也可以从Slave订阅消息。

Message:

消息本身

Topic:

消息主题,用于隔离数据,需要集群内唯一,Topic是逻辑概念,物理上对应多个Queue

Queue:

消息队列,属于某个topic,例如某个topic有三条queue,生产者投递消息时会负载均衡(默认轮询)给这三个queue,也就是说queue是topic实际存储消息的地方,queue支持动态扩展,queue是为了加快topic的消费速度

Tag:

消息的某个属性,对Topic的进一步细分,例如订单topic可以分成创建订单tag、取消订单tag、支付订单tag

Offset:

Offset分为消息点位和消费点位

  • 消息点位就是消息在queue中的偏移量,每个队列有自己的最小消息点位和最大消息点位,内存不够时就回滚最小的消息。
  • 消费点位消费者首次订阅时可以指定从哪个offset开始消费。
    • 集群模式下同一消费者组的消费者的offset应该是一样的offset,由broker以消费者组级别为粒度进行管理,消费者也可以在消费完消息后手动提交offse
    • 广播模式下每个消费者本地自己维护offset

生产消息类型:

同步发送:需要等待MQ的响应结果

异步发送:设置成功和失败的回调函数即可

单向发送:直接发送,不管是否成功

消费消息类型:

集群消费:每条消息只会被订阅了这个topic的每个消费者组中的某一个消费者消费,如有消费者组A和组B和组C,则从组A、组B、组C中分别挑一个消费者出来消费。如果消费失败,不保证每一次重投到同一台机器上

广播消费:每条消息会被订阅了这个topic的每个消费者组中的所有消费者消费,如有消费者组A和组B和组C,则组A、组B、组C中所有的消费者都要消费这条消息

http://www.lqws.cn/news/158617.html

相关文章:

  • 虚拟机网络配置
  • css实现文字颜色渐变
  • 深入理解汇编语言子程序设计与系统调用
  • 第十三节:第四部分:集合框架:HashMap、LinkedHashMap、TreeMap
  • MCP通信方式之Streamable HTTP
  • 开始在本地部署自己的 Gitea 服务器
  • 在 Windows 系统安装 Git
  • [Git] 分布式版本控制 远程仓库协作
  • 右值引用和移动语义
  • 基于WSL搭建Ubnutu 20.04.6 LTS(二)-部署Docker环境
  • uniapp中使用aixos 报错
  • echarts在uniapp中使用安卓真机运行时无法显示的问题
  • SSL/TLS握手全流程拆解:从“Hello“到“安全通道“的每一个字节
  • Excel处理控件Aspose.Cells教程:使用 C# 从 Excel 进行邮件合并
  • uniappx插件nutpi-idcard 开发与使用指南(适配鸿蒙)
  • Linux免杀方案汇总(C语言)
  • 工业火焰探测器市场:现状、趋势与发展策略
  • JAVASCRIPT 简化版数据库--智能编程——仙盟创梦IDE
  • Python绘图库及图像类型之高级可视化
  • Axure 与 Cursor 集成实现方案
  • 矩阵分解相关知识点总结(四)
  • 【TinyWebServer】线程同步封装
  • RDMA简介5之RoCE v2队列
  • Git 推送失败解决教程——error: failed to push some refs to
  • Filebeat收集nginx日志到elasticsearch,最终在kibana做展示(二)
  • 代码训练LeetCode(24)数组乘积
  • day028-Shell自动化编程-判断进阶
  • 验证电机理论与性能:电机试验平板提升测试效率
  • 用 n8n 提取静态网页内容:从 HTTP Request 到 HTML 节点全解析
  • 【HarmonyOS 5】 影视与直播详以及 开发案例