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

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.xdnf.cn/news/12290.html

相关文章:

  • [蓝桥杯]全球变暖
  • Filebeat收集nginx日志到elasticsearch,最终在kibana做展示(二)
  • Next-AI聊天应用-复用chat组件
  • 数据炼金术:电商突围的智能决策革命
  • [闭源saas选项]Pinecone:为向量数据库而生的实时语义搜索引擎
  • OMS主动运维服务:赋能中小企业运维价值升级
  • Java类加载过程
  • 使用子树合并策略更新git项目的部分目录
  • ignore文件不生效的问题
  • 初识硬编码(x86指令描述)
  • 代码随想录算法训练营第九天| 151.翻转字符串里的单词、55.右旋转字符串 、字符串总结
  • CLIP多模态大模型的优势及其在边缘计算中的应用
  • 实时云渲染解决UE像素流送无法进行二次开发的问题
  • spring注解之配置注解
  • 《图解技术体系》How Redis Architecture Evolves?
  • 【科研绘图系列】R语言绘制和弦图(Chord diagram plot)
  • 大模型数据流处理实战:Vue+NDJSON的Markdown安全渲染架构
  • 高防服务器能够抵御哪些网络攻击呢?
  • 宠物空气净化器哪个好用?2025宠物空气净化器测评:352、希喂、有哈
  • 智慧园区数字孪生全链交付方案:降本增效30%,多案例实践驱动全周期交付
  • 基于正点原子阿波罗F429开发板的LWIP应用(5)——TFTP在线升级功能
  • Spring之事务管理方式
  • Go中的协程并发和并发panic处理
  • GitHub 趋势日报 (2025年06月04日)
  • Linux --环境变量,虚拟地址空间
  • 强化学习在LLM中应用:RLHF、DPO
  • 网络通信核心概念全解析:从IP地址到TCP/UDP实战
  • 面试题:Java多线程并发
  • JAVA之 Lambda
  • chrome使用手机调试触屏web