**nameServer: **
- 注册中心,集群中每个nameServer之间并不互联
- broker会向nameServer上注册自己的服务信息
- producer和consumer会去拉去broker服务
- 每个broker都会和所有的nameServer建立连接,使用时可实现负载均衡
- 选择nameServer作为注册中心的好处:
- 轻量级
- 高可用-->因为当服务建立成功之后每个product和consumer都会持有一个broker服务,不需要再去注册中心拉取,当新的消息会直接打到broker上,根据broker处理最终会将消息刷新到consumerQueue中,而consumer会从broker的consumerQueue中拉取消息rocketmq实现了ap并非cp,允许一定程度上的不一致性.
6,nameServer如何保证数据的最终一致:
- 路由注册: 每个nameServer会维护一个broker的表,相当于每个nameServer维护所有的服务,每隔30s发送心跳包,一次维护broker信息,出现多个broker同时出现状态改变操作broker表时,nameServer实现了读写锁:允许同时读,只允许串行写
- 路由剔除:正常情况下broker断开长连接剔除,同时nameServer会有一个定时任务,每隔10s扫描broker表,如果发现超过120s没有更新时间戳也会剔除
- 路由发现:针对的是producter和
consumer Set<String> topicList = new HashSet<String>();
维护一个topicList表,每隔30s会去拉取一次,并且如果30s内出现向某一个broker发送消 息-->客户端重试机制和轮询策略
broker:
1,提供消息接收,存储,拉功能的server
2,一般会配置主从配置方式 1,根据相同的BrokerName 不同的brokerId来指定,BrokerId为0的表示Master BrokerId为1表示slave
3,每30s会向nameServer发送心跳包
producer:消息的发送者
1,producer每30s向nameServer查询新的路由信息(队列和ip的映射关系),即获取当前订阅Topic存在哪些 Broker上,然后对多台broker轮询
2,producer在从nameServer获取到所有的broker信息之后,nameServer也会负载均衡一个broker进行工作
3,一但producer和broker建立长连接之后,30s一次心跳,确认broker信息