Rocketmq 总结 (一) -- NameServer
一 概述
NameServer的主要作用是,
1 路由功能。生产者查询NameServer,根据Topic选择它要发送的MessageQueue。
2 通过和每个broker发送心跳,更新注册信息,剔除失效broker
二 主要成员变量
public class RouteInfoManager { private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME); private final static long BROKER_CHANNEL_EXPIRED_TIME = 1000 * 60 * 2; private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final HashMap<String/* topic */, List<QueueData>> topicQueueTable; private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable; private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable; private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable; private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
其实就是一个个的map保存着broker的信息。
topicQueueTable只是保存着broker的名字,而具体的ip信息在 brokerAddrTable 里。
brokerLiveTable是定时向broker发送心跳包,然后收到心跳包之后更新时间戳。
过程如下,broker启动的时候向所有NameServer发送心跳,然后每隔30s向所有NameServer发送心跳包。NameServer收到Broker心跳包时会更新brokerLiveTable缓存中BrokerLiveInfo的lastUpdateTimeStamp,然后NameServer会每隔10s扫描brokerLiveTable,如果连续120s没有收到心跳包,NameServer将移除该Broker的路由信息同时关闭Socket链接。
三 路由发现
如果发生了broker上线或者下线,NameServer不会主动通知生产者或 消费者。而是靠客户端主动拉取。
拉取的时间默认是30s。所以如果有broker下线,客户端最快也得30s才能发现。