以下内容涉及到broker宕机、consumer宕机后,RocketMq的一系列动作
【broker宕机】
- broker宕机后心跳包(实际上是给namesrv发注册消息)停止
- namesrv发现broker2分钟没有心跳,就移除该broker相关信息
- client每隔30秒从namesrv拉取最新的topic路由信息
- client的清理线程会比较topic的最新路由信息是否移除部分broker,做相应的移除操作
- client在下次拉取消息时,从路由表里找不到master机的地址,就会取slave主机地址
- 若broker主从采用异步同步是有可能丢消息的
【consumer宕机】
- consumer宕机后心跳包(实际上是给broker发订阅消息)停止
- broker发现consumer2分钟没有心跳,就移除该consumer并关闭连接
- broker关闭连接时会通知其他所有consumer,消费者发生变动,需要重新负载
- 其他consumer接到变动消息后,随机选择一个broker拉取最新的消费者列表,然后重新做负载
- 若负载发生变化,则在拉取消息的请求队列里,插入新的拉取请求,并把原来的请求状态置为drop
RocketMq为了简化消息队列的offset处理,限制一个消息队列只能被一个consumer消费,而一个consumer可以消费0到n个消息队列,所以在consumer宕机时,需要迅速通知所有的consumer重新计算负载,才能把宕机的这台consumer负责的消息队列负载到其他consumer上