1

我们的集群在本地运行(目前),一切似乎都配置正确。我们的主要计算消息分布在我们的种子节点上。但是,我们会间歇性地丢失消息。您可以在屏幕截图中看到两次运行的行为。哪些消息被标记为死信完全不一致。

我们的消息总是以相同的方式发送,它们看起来像这样。最后一个参数表示要找到的第 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)

截屏

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

非种子节点:localhost: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: localhost:8081 (leader)

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"]
            }
        }

谁能指出我们正确的方向?我们的配置有问题吗?先感谢您。

4

1 回答 1

1

我想我知道这里的问题是什么——你没有akka.cluster.role定义任何 s ,也没有为你的/commander路由器配置该use-role设置——因此,每条 N 条消息都被丢弃,因为它试图将一条消息路由到自己并且没有有一个/user/cluster演员在场接受它。

要正确解决此问题,我们应该执行以下操作:

  1. 拥有可以处理PrimeCalculationEntry声明的所有节点akka.cluster.roles=[prime]
  2. 让带有路由器的节点/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 次迭代向自己发送消息。

于 2022-03-03T20:00:26.307 回答