《RocketMq》三、NameServer
2015-12-18 17:41
274 查看
RocketMQ-nameSrv用于管理所有broker的信息,以便于Producer和Consumer能够获取到正确的Broker信息,进行业务处理;
可以看到NameSrv的主要管理内容如下:
1.接收Broker的注册,注销请求;
2.Producer获取topic下的所有BrokerQueue,put消息
3.Consumer获取topic下所有的BrokerQueue,get消息
所以可以看到NameSrv主要是维护了Broker相关的内容,进行存取;
问题:
1.如果readQueue和writeQueue数目不一样怎么办?比如readQueue<writeQueue,这不就意味着有的writeQueue没有办法被均分到,读到数据?
2.haServer,masterServer,slave的区别?
haServer:master用来监听slave复制数据的端口
masterServer:主Broker
slave:从Broker,会不断从master复制数据
3.master和slave的brokerId?
master是0
总结:从NameSrv可以看出,如果我们在设计系统的时候,有一些全局使用的公用信息,可以单独独立一个模块进行专门的管理;只需要各个子模块定时向该模块更新信息即可。
privateStringbrokerName;//broker名字
privateintreadQueueNums;//读queue数目
privateintwriteQueueNums;//写queue数目
privateintperm;
privateinttopicSynFlag;
2.2BrokerData:保存了Broker的Id和地址信息
privateStringbrokerName;
privateHashMap<Long/*brokerId*/,String/*brokeraddress*/>brokerAddrs;
2.3BrokerLiveInfo:保存了Broker的心跳信息
privatelonglastUpdateTimestamp;
privateDataVersiondataVersion;
privateChannelchannel;
privateStringhaServerAddr;//master的复制server端口
2.4
//保存topic-queue信息
HashMap<String/*topic*/,List<QueueData>>topicQueueTable;
//保存broker地址信息
HashMap<String/*brokerName*/,BrokerData>brokerAddrTable;////brokerAddrTable(brokerName,brokerData);brokerData(brokerId,brokerAddr);
//保存broker-cluster信息
HashMap<String/*clusterName*/,Set<String/*brokerName*/>>clusterAddrTable;
//保存心跳信息
HashMap<String/*brokerAddr*/,BrokerLiveInfo>brokerLiveTable;
HashMap<String/*brokerAddr*/,List<String>/*FilterServer*/>filterServerTable
其中请求的头部RegisterBrokerRequestHeader
privateStringbrokerName;
privateStringbrokerAddr;
privateStringclusterName;
privateStringhaServerAddr;
privateLongbrokerId;
请求的报文体则是topic的相关信息
privateTopicConfigSerializeWrappertopicConfigSerializeWrapper=newTopicConfigSerializeWrapper();
privateList<String>filterServerList=newArrayList<String>();
Consumer在读取消息时,也会先使用GET_ROUTEINTO_BY_TOPIC获取route信息TopicRouteData
4.4其他模块
单元化订阅组的非单元化
可以看到NameSrv的主要管理内容如下:
1.接收Broker的注册,注销请求;
2.Producer获取topic下的所有BrokerQueue,put消息
3.Consumer获取topic下所有的BrokerQueue,get消息
所以可以看到NameSrv主要是维护了Broker相关的内容,进行存取;
问题:
1.如果readQueue和writeQueue数目不一样怎么办?比如readQueue<writeQueue,这不就意味着有的writeQueue没有办法被均分到,读到数据?
2.haServer,masterServer,slave的区别?
haServer:master用来监听slave复制数据的端口
masterServer:主Broker
slave:从Broker,会不断从master复制数据
3.master和slave的brokerId?
master是0
总结:从NameSrv可以看出,如果我们在设计系统的时候,有一些全局使用的公用信息,可以单独独立一个模块进行专门的管理;只需要各个子模块定时向该模块更新信息即可。
一、总体结构
二、数据结构
2.1QueueData:保存了某个broker的read,write的Queue的数目,Consumer和Producer会分别往read/write里面取存消息2.2BrokerData:保存了Broker的Id和地址信息
2.3BrokerLiveInfo:保存了Broker的心跳信息
2.4
三、心跳处理
主要有3个部分:BrokerHousekeepingService:这个接口会监听网络层的请求,如果有close等关闭请求,直接从brokerLiveTable中移除该数据
routeInfoManager.scanNotActiveBroker:遍历所有的BrokerLiveInfo节点,如果上次访问时间距离现在超过2mins,那么就超时移除连接;Broker会定时向NameSrv发送registerBroker,每次注册都会更新BrokeLiveInfo,相当于心跳
registerBrokerWithFilterServer:broker会不定时的发送RequestCode=REGISTER_BROKER的消息注册自己,这个消息还有一个附带作用就是充当心跳包
四、主要模块
4.1注册broker(RequestCode=REGISTER_BROKER)
其中请求的头部RegisterBrokerRequestHeader
privateStringbrokerAddr;
privateStringclusterName;
privateStringhaServerAddr;
privateLongbrokerId;
请求的报文体则是topic的相关信息
privateList<String>filterServerList=newArrayList<String>();
不断的遍历第三节中的各个表,将数据注册进去,master的brokerId是0
如果不是master,是slave节点,会返回master和HAServer的地址
4.2存放消息
Producer在存放消息时,首先会使用GET_ROUTEINTO_BY_TOPIC获取route信息TopicRouteData
4.3读取消息
Consumer在读取消息时,也会先使用GET_ROUTEINTO_BY_TOPIC获取route信息TopicRouteData
4.4其他模块
单元化订阅组的非单元化
相关文章推荐
- ReviewBoard 的安装和使用(五)—— RBTools工具的使用
- ASP.NET 生命周期及管道事件
- 告诉你什么叫做"机器学习"-------(楼主力荐)
- Java提高配(三七)—–Java集合细节(三):subList的缺陷
- Ubuntu输入密码登陆后又跳到登陆界面解决方案
- WKWebView 的使用简介
- /etc/init.d/ 文件夹下的php-fpm脚步文件
- HDU 5596 ——GTW likes gt——————【想法题】
- Oracle PLSQL读取(解析)Excel文档
- 系统批量运维管理器pexpect的使用
- AS打包jar
- Wix学习整理(7)——在开始菜单中为HelloWorld添加卸载快捷方式
- 阿里SUI 快速搭建手机WEB APP,路由挺好用
- 第13周项目3-Dijkstra算法的验证
- 【JavaWeb】 ServletContext以及讲解Servlet转发
- struts2 注解方式返回json
- ccf 无线网络
- windows下Python3.4安装numpy时出现 “Unable to find vcvarsall.bat ”
- jsp实现ajax的一个例子
- Android Handler机制