出现未处理的 RegistrationException,导致成员过时
作者: matyasberry创建于 2026年7月23日更新于 2026年8月8日
重现步骤(概念性)
- 启动一个多节点 Aeron 集群(
ConsensusModule+ClusteredServiceContainer),其中至少有一个成员的日志/共识端口通过MediaDriver.Context的原生resolverName/resolverInterface/resolverBootstrapNeighborgossip 解析器而不是一个字面/静态地址进行配置。 - 在其他成员继续运行(模拟 pod 重启)时,释放一个成员的
MediaDriver/ConsensusModule/ClusteredServiceContainer,然后立即重新启动该成员的堆栈(新的MediaDriver,新的 gossip 缓存),而不等待 gossip 稳定。 - 如果已释放的成员的
ClusteredServiceContainer在其驱动程序通过 gossip 解析相关对端端口之前接收到其ActiveLogEvent(以重新加入日志/赶上),则joinActiveLog中的aeron.addSubscription(...)将抛出RegistrationException。 - 观察:代理线程不会崩溃(
ClusteredServiceImpl的onStart触发,没有进一步的错误从代理运行程序中抛出),但服务永远不会真正加入日志。logAdapter.image()保持为null,activeLogEvent保持为null,因此pollServiceAdapter()永远不会再次尝试加入。唯一的方法是如果随后发生了一个相关的领导权期限更改,它会为该成员提供一个新的ActiveLogEvent。
内容来源: aeron-io/aeron