如何为绑定到端口 0 时崩溃的服务配置 Akka.Cluster

How to configure Akka.Cluster for services that Crash when binding to port 0

我测试的是以下场景:

启动 2 个 Lighthouses,然后启动一个作为集群成员的 3 服务。它的种子节点配置为之前启动的两个灯塔。

现在这个第 3 个服务的 HOCON 设置为绑定到端口 0,它完成了它的工作并给我一个随机端口。

现在,当我强行退出该服务以模拟崩溃时,Akka.Net 的日志输出变得非常冗长(重要部分)

AssociationError...Tried to associate with unreachable remote address address is now gated for 5000ms ... No connection could be made because the target machine actively refused it.

而且它似乎永远持续下去。我认为这可能是无害的,它看起来像是一个可怕的错误。该消息本身是有道理的,该服务实际上已经消失,因此它无法也永远无法连接。

现在,如果我重新启动该服务,因为它被配置为绑定到 0 for Akka.Remoting,它将获得一个全新的端口,因此其他失败服务的 Unreachable 状态永远不会解决。

这是预期的行为吗?我还认为这里可能有一个配置设置:

auto-down-unreachable-after

现在它带有自己的警告:

Using auto-down implies that two separate clusters will automatically be formed in case of network partition.

这样设置会使消息静音:

auto-down-unreachable-after = 3s

在节点被标记为不可访问后我收到一条新消息:

Association to [akka.tcp://ClusterName@localhost:58977] having UID [983892349]is irrecoverably failed. UID is now quarantined and all messages to this UID will be delivered to dead letters. Remote actorsystem must be restarted to recover from this situation.

必须重新启动远程 actorsystem 才能从这种情况中恢复。 看起来很严重,需要避免。同时,鉴于服务加入随机端口,它是不可恢复的。在尝试获得更多关于 UID 的知识时,它似乎是内部分配的。所以我只能猜测以后不会与 UID 发生任何冲突,所以这是正确的行为。

这似乎是

之外的唯一选择
log-info = off

只是让日志静音

我假设 Lighthouse 服务的日志记录很繁琐,对吧?这是 Akka 八卦协议试图与崩溃节点通信的 'normal' 行为。发生这种情况时,您必须配置您想要执行的操作。

对于每种情况,解决此问题的方法并不总是相同的。例如,这可能取决于您是否 运行 云微服务平台上的服务。但是其中一个选项确实是'auto-downing'。这会将服务标记为 'UNREACHABLE'(如您所见)。这意味着该节点不在集群之外,但集群在没有崩溃节点的情况下继续运行。这就是同一个节点无法加入的原因,因为它仍然被标记为'UNREACHABLE'.

请注意,自动关闭可能会导致集群 'split-brain',其中集群的两个部分(例如,一个包含 4 个节点的集群被分成两个包含 2 个节点的集群)。这是您不希望出现的情况,因此这可能不是最佳解决方案!

Akka.NET 还有其他一些解决方案可供您配置以正确处理此问题:Split Brain Resolver。有关如何配置的更多信息:https://getakka.net/articles/clustering/split-brain-resolver.html

这些都是防止 'split-brain' 情况的策略,将涉及牺牲节点以保持集群的一致性。将这些策略与微服务编排平台(以便实例在 crashing/exiting 后自行重启)结合使用,以创建完美的自我修复 Akka 集群。