考虑到我们有两项服务:
Service2中的代码应该是什么,以便向Service1中的执行元发送命令?另外,是否可以将Service2作为Service1(Akka群集)的一部分?同时考虑到我们只需要维护Service2的一个示例。例如,使用Akka群集节点角色?
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的好处(最明显的是部署一个而不部署另一个的能力)。
1条答案
按热度按时间fnvucqvd1#
一般来说,如果Service 1外部的组件想要与Service 1交互,Service 1应该公开HTTP/GRPC端点(Akka HTTP和Akka GRPC非常适合于此,但任何HTTP/GRPC框架都可以工作)或订阅消息代理(例如Kafka或Pulsar(Alpakka Kafka和pulsar 4s具有Akka集成))。
一般来说,我在上面列出的框架公开了一个请求/消息流,因此Service 1中的代码大纲将是
通过HTTP/GRPC发回响应,或者将响应发布到Service 2正在侦听的Kafka/Pulsar主题。如果命令更多地是一次性使用,您可以:
可以合并Service 2和Service 1。在同一个Akka集群中运行多个服务通常不是一个好主意:您在很大程度上放弃了分解为Service 1和Service 2的好处(最明显的是部署一个而不部署另一个的能力)。