#2099·aeron

出现未处理的 RegistrationException,导致成员过时

作者: matyasberry创建于 2026年7月23日更新于 2026年8月8日

重现步骤(概念性)

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