RocketMQ broker单点宕机导致部分Topic无法发送问题分析

背景 项目生产环境的RocketMQ采用双主双从的架构, 期望达到不丢消息且高可用的目的. 而在实际的生产场景中, 我们却遭遇了当一台broker因内存不足导致java进程终止后, 部分topic消息无法正常发送的问题. 现象和预期不相符, 针对这一问题, 我们对RocketMQ相关部分的设计原理进行了更深入的研究. 设计分析 根据以上状态图可知, Producer 第一次发送会根据 AUTO_CREATE_TOPIC_KEY(TBW102) 从 NameServer 拿到 topicRouteData 作为新创建 topic 的 topicRouteData,而 Producer 中的 MQClientInstance 每30s会从 NameServer 拉取 topic 的 topicRouteData 最新信息并更新到本地内存。 异常情况1 Producer 发送一条信息后关闭掉 Producer,这个时候只有在一个 broker 上面有 topic 信息,下一次启动 Producer 发送消息的时候就会直接从 NameServer…