【RMQ路由中心-NameServer】
路由管理
服务注册
服务发现
消息生产者如何知道消息发往哪台消息服务器Broker?
某一台消息服务器Broker宕机后,消息生产者如何在不重启的情况下感知?
高可用、高性能:
生产者集群、消息服务器Broker集群、消费者集群、NameServer管理集群
NameServer集群
互相独立,彼此不通信,每10秒扫描brokerLive表,如果判断某个Broker前一次发送消息后,超过120秒还未收到任何心跳,则认为该Broker不可用,从表中移除路由。
Broker集群
各实例启动时,向所有NameServer进行注册,用于路由发现;然后用长连接每隔30秒向NameServer发送心跳、topic配置
消息生产者集群
发送消息之前从NS读取Broker地址列表,根据负载算法,选择一个实例,向其发送消息;
消息发送前,需要先获取topic的路由信息,才能知道要发送到哪个Broker;
第一次发送时,本地没有缓存topic的路由信息,请求NS获取,更新到本地路由信息表;
缓存机制:每隔30秒将NS的topic路由信息缓存进行更新。
消息消费者集群
长连接每隔30秒请求NS,获取实时的topic信息
注意:
NS每隔10秒检测一次,期间如果某个Broker宕机后,则无法立即感知,则需要在发送端提供容错机制
用于保证消息发送高可用。
消息发送方式
(1)同步:发送后阻塞等待,直到Broker返回发送结果
(2)异步:发送后立即返回,异步回调在新的线程中执行
(3)单向:只管发,发完就返回,不管成功失败
消息队列如何进行负载均衡?
消息发送如何实现高可用?
默认使用轮询算法进行负载均衡;
消息发送失败,默认重试两次;
消息第一次发送失败后,为了保证重试的可靠性,重试时避开刚刚接收到失败的Broker,选择其他Broker上的队列发送
举例:
假定topicA的路由信息:Broker1上有q1、q2、q3、q4四个队列,Broker2上有q1、q2、q3、q4四个队列
如果B1q1发送失败,则轮询下次采用B1q2,如果B1宕机了,则轮询没有意义
解决办法:发送失败时对Broker进行规避,比如在接下来的5分钟选择队列时,B1将不参与负载均衡
消息发送失败的故障延迟机制是什么?
消息发送流程是什么?
批量消息如何实现一致性?
DefaultMQProducer消息生产者可以干什么?
(1)创建主题:指定主题名、队列数量
(2)发送消息(三种方式)+ 系统负载算法指定队列;发送消息(三种方式)+ 特定队列;发送消息(三种方式)+ 特定负载算法;同步批量
(3)查找消息队列中的最大/最小物理偏移量;根据偏移量查找消息;根据主题+消息ID查找消息;
(4)根据时间戳从队列中搜索偏移量,用于快速定位是哪个commitLog文件