与Akka的跨服务电话

时间:2015-04-11 15:36:49

标签: akka akka-cluster akka-remote-actor akka.net

我正在玩新发布的Akka.Net 1.0(祝贺发布!)所以对我来说这一切都很新鲜,但我很确定拥有JVM Akka经验的人也可以因为在这个问题中没有任何与运行时相关的东西。

让我们考虑几个(为了示例,2)单独的服务,它们是更大的系统/应用程序的一部分。这些服务通常都是自己做的事情,但有时需要跨服务电话。我们假设Service 2可以是独立的,并且有GetStuff个动作。 Service 1有一个DoSomething操作,必须首先获得GetStuff操作的结果。

当两种服务可以单独部署到不同的机器时,处理这种情况的首选方法是什么?

正如我所说,我对阿卡不太了解,但通过实例,文档和来源挖掘我发现了两个选择:

  1. 远程处理。使用Remoting从他们自己的服务中分离actor系统以从远程主机获取ActorSelection。它与Remoting docs example几乎相同,只是两个演员系统将是相同的'客户'。
  2. 聚类。我试图解决这个问题,我现在能够解决的最多问题是建立一个单独的集群服务,只需设置集群系统,创建一个简单的侦听器actor,以便种子节点可以正确初始化(?)。然后,在他们自己的服务中创建的每个单独的actor系统将以不同的角色加入到所述集群系统。
  3. 也许还有另一种我不知道的解决方案......?

    就个人而言,聚类解决方案乍一看似乎难以掌握和设置,但也许我现在无法看到一些显着优势。

    重申一下,处理这种情况的首选方式是什么?我应该注意什么?

1 个答案:

答案 0 :(得分:1)

Akka.Cluster取决于Akka.Remote - 这是他们的根本不同之处:

  • Akka.Remote - 允许您与在远程进程中运行的actor系统进行连接和通信。可以是完全独立的代码库,运行完全不同的Akka.NET应用程序(“服务”,如果你愿意的话。)你需要在两个系统之间进行通信,这是一组在两个进程中都可见的消息类。
  • Akka.Cluster - Akka.Remote之上的抽象,消除了每个服务实例必须知道您可能需要连接的每个其他可能服务实例的显式地址的需要至。这些可以是相同服务的实例或不同服务的实例。通过非常简单的“种子节点”策略实现服务的动态发现。

我建议你看看我写的Akka.Cluster microservices example - 它展示了如何使用Akka.Cluster“角色”功能动态地对不同服务中的节点进行跨服务调用,而不必明确定义他们的任何网络地址。特别是,看看我如何使用“群集感知”路由器来执行此操作。