如何从“外部”发送命令给已分片的Akka集群中的执行者?

hc8w905p  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(128)

考虑到我们有两项服务:

  • 服务1:启用了群集和分片的Akka应用程序形成的分片Akka群集
  • 服务2(不基于Akka):将命令发送到分片的Akka群集(服务1)

Service2中的代码应该是什么,以便向Service1中的执行元发送命令?
另外,是否可以将Service2作为Service1(Akka群集)的一部分?同时考虑到我们只需要维护Service2的一个示例。例如,使用Akka群集节点角色?

fnvucqvd

fnvucqvd1#

一般来说,如果Service 1外部的组件想要与Service 1交互,Service 1应该公开HTTP/GRPC端点(Akka HTTP和Akka GRPC非常适合于此,但任何HTTP/GRPC框架都可以工作)或订阅消息代理(例如Kafka或Pulsar(Alpakka Kafka和pulsar 4s具有Akka集成))。
一般来说,我在上面列出的框架公开了一个请求/消息流,因此Service 1中的代码大纲将是

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

通过HTTP/GRPC发回响应,或者将响应发布到Service 2正在侦听的Kafka/Pulsar主题。如果命令更多地是一次性使用,您可以:

source
  .map {
    sendCommand(constructCommand(_))
  }
  .runWith(Sink.ignore)

可以合并Service 2和Service 1。在同一个Akka集群中运行多个服务通常不是一个好主意:您在很大程度上放弃了分解为Service 1和Service 2的好处(最明显的是部署一个而不部署另一个的能力)。

相关问题