Akka.NET群集间歇性死信

yrefmtwq  于 2022-11-05  发布在  .NET
关注(0)|答案(2)|浏览(183)

我们的集群在本地运行(目前),一切似乎都配置正确。我们的主要计算消息分布在我们的种子节点上。但是,我们间歇性地丢失消息。您可以在屏幕截图中看到两次运行的行为。哪些消息被标记为死信根本不一致。
我们的信息总是以同样的方式发送,它们看起来像这样。最后一个参数意味着要找到的第n个素数。

new PrimeCalculationEntry(id, 1, 100000),
new PrimeCalculationEntry(id, 2, 150000),
new PrimeCalculationEntry(id, 3, 200000),
new PrimeCalculationEntry(id, 4, 250000),
new PrimeCalculationEntry(id, 5, 300000),
new PrimeCalculationEntry(id, 6, 350000),
new PrimeCalculationEntry(id, 7, 400000),
new PrimeCalculationEntry(id, 8, 450000)

我们的集群是这样设置的:一个非种子节点,它是组路由器,并将消息发送到两个种子节点,这两个种子节点被配置为池路由器。

非种子节点:本地主机:0(随机端口)

akka {
            actor {
                provider = cluster
                deployment {
                    /commander {
                        router = round-robin-group # routing strategy
                        routees.paths = ["/user/cluster"] # path of routee on each node
                        cluster {
                            enabled = on
                            allow-local-routees = on
                        }
                    }
                }
            }
            remote {
                dot-netty.tcp {
                    port = 0 #let os pick random port
                    hostname = localhost
                }
            }
            cluster {
                seed-nodes = ["akka.tcp://ClusterSystem@localhost:8081", "akka.tcp://ClusterSystem@localhost:8082"]
            }
        }

种子节点1:本地主机:8081(领导者)

akka {
            actor {
                provider = cluster
                deployment {
                    /cluster {
                        router = round-robin-pool
                        nr-of-instances = 10
                    }
                }
            }
            remote {
                dot-netty.tcp {
                    port = 8081
                    hostname = localhost
                }
            }
            cluster {
                seed-nodes = ["akka.tcp://ClusterSystem@localhost:8081"]
            }
        }

种子节点2:本地主机:8082

akka {
            actor {
                provider = cluster
                deployment {
                    /cluster {
                        router = round-robin-pool
                        nr-of-instances = 10
                    }
                }
            }
            remote {
                dot-netty.tcp {
                    port = 8082
                    hostname = localhost
                }
            }
            cluster {
                seed-nodes = ["akka.tcp://ClusterSystem@localhost:8081"]
            }
        }

有人能给我们指出正确的方向吗?我们的配置有什么问题吗?提前感谢。

jjjwad0x

jjjwad0x1#

我想我知道这里的问题是什么-您没有定义任何akka.cluster.role,您的/commander路由器也没有配置use-role设置-因此,每第N条消息都会被丢弃,因为它试图将消息路由 * 到自己 *,并且没有/user/cluster参与者来接收它。
要正确解决此问题,我们应该执行以下操作:
1.让所有可以处理PrimeCalculationEntry的节点声明akka.cluster.roles=[prime]
1.让具有/commander路由器的节点将其HOCON更改为:

/commander {
        router = round-robin-group # routing strategy
        routees.paths = ["/user/cluster"] # path of routee on each node
        cluster {
            enabled = on
            allow-local-routees = on
            use-role = "prime"
        }
    }

这将消除死信,因为/commander节点将不再每N次迭代向其自身发送消息。

epfja78i

epfja78i2#

我从@Aaronontheweb上看到答案太晚了。我们通过在commandor HOCON上将allow-local-routees设置为off来“修复”它。但我想更好的解决方案是按照答案中提到的那样正确设置角色。

相关问题