RocketMQ的路由中心

87 阅读1分钟

路由中心(NameServer)

简单直接,先放张图吧

image.png

先简单随意的描述下吧

  1. NameServer:几台机器,运行着一些程序,和外部其他机器有一些交互;
  2. Broker:和NameServer存在交互的几台机器

以上两者的交互是什么?

NameServer上会存储一些信息(broker的信息),NameServer上有一个定时执行的程序,间隔x秒会执行一次,主要做的就是检查broker是不是还活着,如果不是,就把自己存储的broker信息给剔除掉

当然, NameServer上存储的broker信息比较多且含义复杂,不是那么快能说清楚的;剔除逻辑也不是这么简单,后续再深刻理解,暂时先这样。

关于NameServer上存储的信息,举个例子吧

Map<String,BrokerLiveInfo> brokerLiveTable;(broker状态信息表)

{
    "192.168.56.1:6666":{
        "lastUpdateTimestamp":1518270318980,
        "dataVersion":"versionObj",
        "channel":"channelObj",
        "haServerAddr":"192.168.56.2:6666"
    },
    "192.168.56.2:6666":{
    }
}

192.168.56.1:6666的lastUpdateTimestamp,记录上次收到broker心跳包的时间。

  1. broker启动时向所有NameServer发送心跳包,NameServer收到之后,去更新brokerLiveTable的指定broker的lastUpdateTimestamp;
  2. NameServer的定时程序扫描brokerLiveTable,如果lastUpdateTimestamp很久(很久其实是一个具体的数值)没有更新,NameServer认为这个broker死亡了,就从brokerLiveTable中移除这个broker,也就是Map的一个key。

补充内容

topic的消息队列

Map<String,List< QueueData>> topicQueueTable;

"topic1": [
    {
        "brokerName":"broker-a",
        "readQueueNums":4,
        "perm":6, //读写权限
        "topicSynFlag":0 //topic同步标记
    },
    {
        "brokerName":"broker-b"
        //...
    }
],
"topic2":[
    //...
]

一个topic拥有多个消息队列,一个broker为每一个topic默认创建4个读队列,4个写队列。