【RocketMQ】基本概念、NameServer

31 阅读3分钟

基本概念

基本概念:

  • 生产者:发送数据到消息队列的客户端
  • 消费者:消费消息队列数据的客户端
  • 消息队列:提供消息队列服务,负责接收生产者发送的数据,异步向消费者发送需要消费的数据,像一个队列一样。

对消息队列的理解:

一个数据运输系统,从数据发送方接收数据,向数据接收方发送数据,有一定的数据暂时存储能力。像一个蓄水池,生产者为入水口,消费者为出水口。

消息队列的作用:

  • 进程间的通信:实现生产者到消费者的单向通信。
  • 数据分发:不同的topic实现一对多数据分发
  • 异步任务处理:生产者可发送消息到消息队列后直接返回,剩下的事消费者异步处理。
  • 削峰填谷:消息队列有一定的数据存储能力,瞬时突增的任务对于消费者可以后面慢慢处理
  • 解耦:新增处理需求时,无需修改生产者的代码,只需要新增一个消费者,像可插拔的组件一样

NameServer

作用:存储集群的broker、topic等信息,为client提供服务发现

NameServer 存储的信息:

  • topicQueueTable:存储 topic 的路由列表信息,包括 brokername、读写队列数、读写权限、topic同步标记

  • brokerAddrTable:存储 broker 信息,包括 brokername、集群名字、主备 broker 地址

  • clusterAddrTable:存储集群信息,包含的所有broker

  • brokerLiveTable:存储 broker 活跃状态,上一次心跳的时间

  • filterServerTable:Broker 上的 FilterServer 列表,用于类模式消息过滤

路由注册、更新过程:

  1. Broker 每30s向所有 NameServer 发送心跳

    1. header包含:broker地址、brokerId、brokerName、clusterName、master地址
    2. body包含:filterServerList 消息过滤服务器列表、topicConfigWrapper 主题配置
  2. NameServer 处理心跳消息,加锁后进行如下处理:

    1. 查找 clusterAddrTable 判断 cluster 是否存在,不存在就创建并添加此 broker

    2. 查找 brokerAddrTable 判断 broker 是否存在,

      • 不存在就创建并添加,registerFirst 标记为 true
      • 存在就更新信息,registerFirst 标记为 false
    3. 更新topic信息:当broker为master,初次注册或topic信息更新时,更新 topicQueueTable

    4. 更新 brokerLiveTable 对应的心跳时间

    5. 更新 filterServerTable ,broker 为从节点时额外更新对应的 masterAddr

路由删除过程:

  • NameServer 每10s检查 brokerLiveTable 中各broker的存活状态,当超过120s未更新心跳,说明broker出现故障,加锁后进行如下删除操作:

    • 根据 brokerAddress 将broker从brokerLiveTable、filterServerTable移除
    • 遍历 brokerAddrTable 根据 brokerAddress 删除对应 BrokerData 中的addr信息,当 addr 为空,移除整个BrokerData
    • 根据brokerName,删除clusterAddrTable中的信息,当删除后为空,删除整个cluster
    • 根据brokerName,遍历topicQueueTable,删除对应brokerName,当删除后brokerName为空,则删除整个topic
  • 其次,broker正常关闭时,也会删除对应路由信息

路由发现过程:

  • 客户端定时主动请求NameServer拉取最新路由信息:

    • orderTopicConf:顺序消息配置内容

    • queueData:topic队列元数据

    • brokerDatas:topic分布的broker元数据

    • filterServerTable:broker上过滤服务器地址列表

NameServer 如何实现高可用?

NameServer 由多台机器组成,每台机器权力对等,都可以提供路由注册与发现的服务,机器间不会进行数据交流。只要有存活的 NameServer 就可以提供服务。