Как отправить команду субъекту в изолированном кластере Akka «извне»?

#akka #sharding #akka-cluster

#akka #сегментирование #akka-кластер

Вопрос:

Учитывая, что у нас есть две службы:

  • Сервис 1: Изолированный кластер Akka, сформированный приложением Akka с включенной кластеризацией и сегментирование
  • Сервис2 (не основанный на Akka): отправляет команды в изолированный кластер Akka (Сервис1)

Каким должен быть код в Service2 для отправки команд субъектам в Service1?

Кроме того, возможно ли сделать Service2 частью Service1 (кластера Akka)? также учитывая, что нам нужно поддерживать только один экземпляр Service2. Например, с использованием ролей узла кластера Akka?

Комментарии:

1. Не уверен, почему вопрос был отклонен. Отсутствует документация Akka по аспекту внешних коммуникаций кластера. Я провел исследование, но не нашел непосредственно связанной информации.

Ответ №1:

В общем, если компоненты за пределами Service1 хотят взаимодействовать с Service1, Service1 должен либо предоставить конечные точки HTTP / GRPC (Akka HTTP и Akka GRPC хорошо подходят для этого, но может работать любой фреймворк HTTP / GRPC), либо подписаться на посредника сообщений (например, Kafka или Pulsar (Alpakka Kafka и pulsar4s имеют интеграцию с Akka)).

В общем, фреймворки, которые я перечислил выше, предоставляют поток запросов / сообщений, поэтому схема кода в Service1 будет

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

При этом ответы отправляются обратно по HTTP / GRPC или публикуются в теме Kafka / Pulsar, которую прослушивает Service2. Если команды чаще запускаются и забываются, вы могли бы:

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

Можно объединить Service2 и Service1. Как правило, не очень хорошая идея запускать несколько служб в одном кластере Akka: вы в значительной степени отказываетесь от преимуществ декомпозиции на Service1 и Service2 (в первую очередь от возможности развертывания одной без развертывания другой).

Комментарии:

1. Спасибо тебе, Леви, за все замечательные замечания. Что касается «Возможно объединить Service2 и Service1». — как это можно сделать, учитывая, что нам всегда будет нужен только один экземпляр Service2 в кластере Akka, в то время как Service1 может иметь несколько экземпляров как часть одного кластера?

2. Если вам нужен единственный экземпляр чего-либо внутри кластера Akka, Cluster Singleton хорошо подходит для этого.