MST

星途 面试题库

面试题:消息队列之RocketMQ消息发送流程的关键环节

请详细阐述RocketMQ消息发送流程中,生产者是如何与NameServer交互来确定消息发送的目标Broker的,以及在这个过程中涉及到哪些主要的数据结构和操作?
37.3万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

生产者与NameServer交互确定目标Broker流程

  1. 获取Broker路由信息
    • 生产者启动时,会向NameServer集群中的所有NameServer节点发送请求,获取Broker的路由信息。NameServer会将存储的Broker相关信息(包括Broker的地址、所属集群、Topic与Broker的映射关系等)返回给生产者。
    • 生产者会定时(默认30秒)从NameServer拉取最新的路由信息,以保证信息的实时性,能够应对Broker节点的动态变化(如Broker上线、下线等)。
  2. 选择目标Broker
    • 生产者在获取到路由信息后,根据负载均衡策略选择一个目标Broker来发送消息。常见的负载均衡策略有轮询、随机等。例如,默认的策略是轮询,即按照一定顺序依次选择不同的Broker。
    • 对于指定了消息队列的情况(如事务消息等),会根据消息队列与Broker的对应关系,直接选择对应的Broker。

主要数据结构

  1. TopicRouteData:NameServer返回给生产者的路由数据结构,包含了Topic相关的路由信息。它包括该Topic的所有队列信息,以及每个队列对应的Broker名称,同时还包含Broker集群的相关信息。
  2. QueueData:是TopicRouteData中的一个内部结构,代表一个消息队列的数据。包含队列所属的Broker名称、读写队列数量等信息。
  3. BrokerData:也是TopicRouteData中的内部结构,存储了Broker的详细信息。包括Broker所属集群名称、Broker名称以及该Broker的所有物理地址列表。
  4. ProducerTable:NameServer中用于存储生产者信息的结构,维护了生产者组与生产者实例的对应关系。虽然在生产者确定目标Broker过程中不是直接用到,但对于NameServer管理生产者有重要作用。

主要操作

  1. 请求与响应操作
    • 生产者向NameServer发送获取路由信息的请求,使用的是Netty网络通信框架进行远程调用。NameServer接收到请求后,查询内部存储的路由数据,并将对应的TopicRouteData结构返回给生产者。
  2. 路由信息更新操作
    • Broker会定时(默认30秒)向NameServer发送心跳包,包含自身的最新信息。NameServer接收到心跳包后,更新内部存储的Broker路由信息。当生产者下次拉取路由信息时,就能获取到最新的内容。
  3. 负载均衡操作
    • 生产者在本地实现负载均衡策略。以轮询策略为例,生产者维护一个索引值,每次选择Broker时,根据索引值从可用Broker列表中选择一个,然后将索引值递增,指向下一个Broker,循环往复实现负载均衡发送消息。