使用 Akka 进行跨服务调用

Cross-service calls with Akka

我正在玩新发布的 Akka.Net 1.0(祝贺发布!)所以这对我来说都是全新的,但我很确定任何有 JVM Akka 经验的人也可以插话,因为有问题中没有任何依赖于运行时的内容。

让我们考虑几个(例如,2)独立的服务,它们是更大 system/application 的一部分。这些服务通常做自己的事情,但有时需要跨服务调用。假设 Service 2 可以独立并具有 GetStuff 操作。 Service 1 有一个 DoSomething 动作,它必须先得到 GetStuff 动作的结果。

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

正如我所说,我对 Akka 了解不多,但是通过示例、文档和源代码我发现了两个选择:

  1. 远程处理。使用 Remoting 从远程主机获取 ActorSelection,在他们自己的服务中分离参与者系统。它与 Remoting docs example 几乎相同,只是两个 actor 系统相等 'clients'.
  2. 聚类。我正在努力解决这个问题,我现在能想到的最多的是设置一个单独的集群服务,它只设置集群系统,创建一个简单的侦听器参与者,以便种子节点可以正确初始化(?)。然后在他们自己的服务中创建的每个单独的参与者系统将以不同的角色加入到所述集群系统。

也许还有另一种我不知道的解决方案...?

就个人而言,集群解决方案乍一看似乎更难掌握和设置,但也许有一些我现在看不到的重要优势。

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

Akka.Cluster 取决于 Akka.Remote - 这是它们的根本区别:

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

我建议您看一下我写的 Akka.Cluster microservices example - 它展示了如何使用 Akka.Cluster "roles" 功能动态地对节点进行跨服务调用不同的服务,而不必明确定义它们的任何网络地址。特别是,看看我是如何使用 "cluster-aware" 路由器来做到这一点的。