问题描述
考虑到我们有两项服务:
- 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的好处(最值得注意的是,可以在不部署另一个服务的情况下进行部署)。