路由中心(NameServer)
简单直接,先放张图吧
先简单随意的描述下吧
- NameServer:几台机器,运行着一些程序,和外部其他机器有一些交互;
- 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心跳包的时间。
- broker启动时向所有NameServer发送心跳包,NameServer收到之后,去更新brokerLiveTable的指定broker的lastUpdateTimestamp;
- 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个写队列。