我们的集群在本地运行(目前),一切似乎都配置正确。我们的主要计算消息分布在我们的种子节点上。但是,我们间歇性地丢失消息。您可以在屏幕截图中看到两次运行的行为。哪些消息被标记为死信根本不一致。
我们的信息总是以同样的方式发送,它们看起来像这样。最后一个参数意味着要找到的第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"]
}
}
有人能给我们指出正确的方向吗?我们的配置有什么问题吗?提前感谢。
2条答案
按热度按时间jjjwad0x1#
我想我知道这里的问题是什么-您没有定义任何
akka.cluster.role
,您的/commander
路由器也没有配置use-role
设置-因此,每第N条消息都会被丢弃,因为它试图将消息路由 * 到自己 *,并且没有/user/cluster
参与者来接收它。要正确解决此问题,我们应该执行以下操作:
1.让所有可以处理
PrimeCalculationEntry
的节点声明akka.cluster.roles=[prime]
1.让具有
/commander
路由器的节点将其HOCON更改为:这将消除死信,因为
/commander
节点将不再每N次迭代向其自身发送消息。epfja78i2#
我从@Aaronontheweb上看到答案太晚了。我们通过在commandor HOCON上将
allow-local-routees
设置为off来“修复”它。但我想更好的解决方案是按照答案中提到的那样正确设置角色。