2

我正在使用新发布的 Akka.Net 1.0(恭喜发布!)所以这对我来说都是新的,但我很确定任何有 JVM Akka 经验的人也可以加入,因为在问题。

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

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

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

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

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

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

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

4

1 回答 1

3

Akka.Cluster 依赖于 Akka.Remote - 这是它们的根本不同之处:

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

我建议您看一下我编写的Akka.Cluster 微服务示例- 它展示了如何使用 Akka.Cluster “角色”功能动态地对不同服务中的节点进行跨服务调用,而无需显式定义任何他们的网络地址。特别是,看看我如何使用“集群感知”路由器来做到这一点。

于 2015-04-11T22:47:33.457 回答