消息队列

消息队列原理以及各种消息中间件
帅旋
关注
充电
IT宅站长,技术博主,共享单车手,全网id:arthinking。

RocketMQ底层是如何工作的?

发布于 2021-10-17 | 更新于 2024-02-27

RocketMQ运行原理

RocketMQ运行原理如下图所示:

image-20211017212356716

  • 首先,启动每个NameServer节点,共同构成一个NameServer Cluster。NameServer启动后,监听端口,等待Broker、Producer、Consumer的连接;
  • 然后启动Broker的主从节点,这个时候Broker会与所有的NameServer建立并保持长连接,定时发送心跳包,把自己的信息(IP+端口号)以及存储的所有Topic信息注册到每个NameServer中。这样NameServer集群中就有Topic和Broker的映射关系了;
  • 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic,每个Topic默认会分配4个Queue;
  • 启动生产者,这个时候生产者会把信息注册到NameServer中,并且从NameServer获取Broker服务器,Queue等信息;
  • 启动消费者,这个时候消费者会把信息注册到NameServer中,并且从NameServer获取Broker服务器,Queue等信息;
  • 生产者发送消息到Broker集群中的时候,会从所有的Master节点的对应Topic中选择一个Queue,然后与Queue所在的Broker建立长连接从而向Broker投递消息。消息实际上是存储在了CommitLog文件中,而Queue文件里面存储的实际是消息在CommitLog中的存储位置信息;
  • 消费者从Broker集群中消费消息的时候,会通过特定的负载均衡算法,绑定一个消息队列进行消费;
  • 消费者会定时(或者kill阶段)把Queue的消费进度offset提交到Broker的consumerOffset.json文件中记录起来;
  • 主节点和从节点之间可以是同步或者异步的进行数据复制,相关配置参数:
    • brokerRole,可选值:
      • ASYNC_MASTER:异步复制方式(异步双写),生产者写入消息到Master之后,无需等到消息复制到Slave即可返回,消息的复制由旁路线程进行异步复制;
      • SYNC_MASTER:同步复制方式(同步双写),生产者写入消息到Master之后,需要等到Slave复制成功才可以返回。如果有多个Slave,只需要有一个Slave复制成功,并成功应答,就算复制成功了。这里是否持久化到磁盘依赖于另一个参数:flushDiskType
      • SLAVE:从节点

References

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/mq/rocketmq/operating-principle.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。