如何从“外部”向分片Akka群集中的Actor发送命令?

问题描述

考虑到我们有两项服务:

  • Service1:由启用了群集和分片功能的Akka应用程序组成的分片Akka群集
  • Service2(不是基于Akka的):将命令发送到分片的Akka群集(Service1)

在Service2中向Service1中的Actor发送命令的代码应该是什么?

还可以使Service2成为Service1(Akka群集)的一部分吗?还考虑到我们只需要维护一个Service2实例。例如,使用Akka群集节点角色?

解决方法

通常,如果Service1之外的组件要与Service1进行交互,则Service1应该公开HTTP / GRPC端点(Akka HTTP和Akka GRPC非常适合此操作,但是任何HTTP / GRPC框架都可以使用)或订阅消息代理(例如Kafka或Pulsar(Alpakka Kafka和pulsar4s具有Akka集成)。

通常,我上面列出的框架公开了请求/消息流,因此Service1中的代码概要为

emailUser.getCurrentUser().linkWithCredential(phoneUserCredential)

响应通过HTTP / GRPC发送回或发布到Service2正在侦听的Kafka / Pulsar主题。如果这些命令更加激怒而忘记了,那么您可以:

 val parallelism = ??? // how many commands in flight from the stream
 source
   .map(constructCommand)
   .mapAsync(parallelism) { cmd =>
     futResponseTo(cmd)
   }

可以合并Service2和Service1。在同一个Akka群集中运行多个服务通常不是一个好主意:您主要是放弃了分解为Service1和Service2的好处(最值得注意的是,可以在不部署另一个服务的情况下进行部署)。