broker 集群工作流程
- NameSrv启动成功后,等待broker、Consumer和producer启动后也与NameSrv保持长连接,
NameSrv相当于是路由控制中心。 - 启动broker, broker与所有的NameSrv建立长连接, broker,通过定时线程定时向NameSrv发送心跳,broker信息注册到所有的NameSrv上, 包含brokerName、brokerAddr、clusterName等由nameSrv去保存。
- producer启动时,先随机选择Namesrv集群中的某一台机器保持长连接,同时手动创建topic, 然后指定topic放入到哪些broker中,创建topic的过程可以自动,因此在发送消息前,producer会先根据topic去找到哪些broker,然后拿到broker里的所有队列列表,轮询从队列列表中选择一个队列,然后与队列所在的broker建立连接,向broker发送消息。
- Consumer消费消息前,先随机选择Namesrv集群中的某一台机器保持长连接, 然后根据topic
去NameSrv中找到有哪些broker,然后consumer与broker建立连接,consumer就能消费到消息了。
Broker写入过程
实时更新消息消费队列与索引文件
消息队列和索引文件恢复
Broker异常退出, 导致CommitLog、ConsumerQueue、IndexFile文件数据不一致
Broker异常停止文件恢复的实现为CommitLog#recoverAbnormally。异常文件恢复步骤与正常停止文件恢复流程基本相同,其主要差别有两个。首先,正常停止默认从倒数第三个文件开始进行恢复,而异常停止则需要从最后一个文件往前走,找到第一个消息存储正常的文件。其次,如果CommitLog目录没有消息文件,如果消息消费队列目录下存在文件,则需要销毁。
过期文件删除机制