gpt4 book ai didi

akka - Akka Cluster Client 能否向不在初始联系中的集群节点发送消息?

转载 作者:行者123 更新时间:2023-12-01 12:29:27 25 4
gpt4 key购买 nike

使用 Akka 2.3.14,我正在尝试创建一个包含各种服务的 Akka 集群。到目前为止,我的所有“服务”都在一个跨多个节点集群的工件中,但现在我正试图将这个工件分解为多个服务,这些服务都存在于同一个集群上。

因此,在分解时,我们将其设计为集群上的任何节点都将首先尝试连接到种子节点。如果没有种子节点,它将查看它是否是作为种子节点运行的候选者(如果它在种子节点可以在的同一主机上),在这种情况下它将获取一个开放的种子节点端口并成为种子节点。所以从这个意义上说,集群中的任何服务都可以成为种子节点。

至少,这是个主意。我们在该系统中作为单独服务运行的 API 将 ClusterClient 实现到该系统中。 initialContacts 设置为与种子节点相同。问题是我可以通过 ClusterClient 向其发送消息的唯一接待员角色是种子节点上的角色。

这里是一个例子,如果它有帮助的话。假设我有一个 String Service 和一个 Double Service,每个服务的接待员分别是一个 StringActor 和一个 DoubleActor。现在假设我有一个客户端服务,它将 StringMessages 和 DoubleMessages 发送到 StringActor 和 DoubleActor

为了简单起见,假设我有两个节点,server1 和 server2 然后:

seed-nodes = ["akka.tcp://system@server1:2773", "akka.tcp://system@server2:2773"]

我的 ClusterClient 会像这样初始化:

system.actorOf(
ClusterClient.props(
Set(
system.actorSelection("akka.tcp://system@server1:2773/user/receptionist"),
system.actorSelection("akka.tcp://system@server2:2773/user/receptionist")
)
),
"clusterClient"
)

以下是发生在我身上的场景:

  1. 如果 StringServices 首先在两个服务器上启动,那么来自客户端服务的 DoubleMessages 就会消失在以太中。
  2. 如果 DoubleServices 首先在两个服务器上启动,那么来自客户端服务的 StringMessages 就会消失在以太中。
  3. 如果 StringService 首先在 serverX 上启动,而 DoubleService 首先在 serverY 上启动,那么所有 StringMessages 将被发送到 serverX,所有 DoubleMessages 将被发送到 serverY,这没有上面的情况那么糟糕,但这意味着它并不是真正的缩放。

这不是我所期望的,它可能只是我的代码中的一个缺陷,所以我想知道这是否是预期的行为。如果没有,那么是否有另一个 Akka 概念可以帮助我解决这个问题?

可以说,我可以只将一种服务类型设为我的入口点,例如可以接受 StringMessages 或 DoubleMessages 的 RoutingService,然后将其发送到正确的服务。但是,如果客户端服务只能向初始联系人中的 RoutingService 实例发送消息,那么我就无法动态扩展 RoutingService,因为无论我添加多少节点,客户端服务都只能向初始联系人发送消息。

我也在考虑在我的客户端服务中订阅 ClusterEvents,看看我是否可以在集群中启动节点时从我的集群客户端添加和删除初始联系人,但我不确定这是否可行,感觉应该有更好的解决方案。

最佳答案

这是我在进行更多故障排除后发现的,以防对其他人有所帮助:

ClusterClient 将尝试按顺序连接到初始联系人,然后仅通过该连接发送消息。如果您在每个节点上部署不同的服务,您将会遇到问题,因为从 ClusterClient 发送的消息只会发送到它建立连接的节点。这样,您可以将 ClusterClient 视为一个合法的客户端,它会连接到您给它的 URL,然后通过该 URL 继续与服务器通信。

阅读Distributed Workers例如,我意识到我的前端,或者在本例中是我的路由服务,实际上应该是集群的一部分,而不是充当客户端。为此,我改用了 DistributedPubSub 方法。

关于akka - Akka Cluster Client 能否向不在初始联系中的集群节点发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35785745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com