Подходит ли модель актера (акка) для моего приложения?

Я уже некоторое время читаю блоги, слушаю подкасты и читаю документацию Akka, но я все еще не могу сказать, что действительно понимаю, подходит ли модель акторов для того, что я пытаюсь решить.

Давайте возьмем пример создания приложения, которое сообщает вам, какая собака лучше всего подойдет человеку (не совсем то, что я делаю, но хорошо описывает то, что я хочу сделать). Каждую секунду я получаю МНОГО сообщений от людей, которые хотят знать, какую собаку купить, и система должна решать, какую собаку им следует завести, на основе имеющейся у меня информации об этом человеке.

  1. Событие: человек А хочет собаку

  2. Мой подписчик: Хорошо, человек А хочет собаку, давай проверим, какую собаку ему подарить - ›просит мое приложение выяснить это

  3. Приложение:

  • Получает запрос
  • Собирает больше данных об этом человеке из других систем (где он живет, какое пространство у него есть, время, насколько он спортивный и т. Д.)
  • Просит темы / актеров / еще что-нибудь использовать набор правил, чтобы проверить, какую собаку им следует завести.

Примеры:

  • Живет ли человек в какой-либо из этих областей (проверяет тайник с участками, подходящими для больших собак) (большинство проверок будет искать вещи в списках)
  • Есть ли у человека дом больше или меньше x
  • Человек работает много часов
  • и т.д

Все эти проверки возвращают результат в приложение, и приложение собирает все ответы, пока все не будет сделано, и затем на основе этого принимает решение о результате.

Теперь имейте в виду, что сообщений будет постоянно много, и я хочу запускать эти проверки одновременно, чтобы иметь возможность отвечать как можно быстрее. Приложение будет работать в контейнере в кластере Kubernetes, и я хочу иметь возможность масштабировать приложение при пиковой нагрузке или при увеличении объема сообщений в будущем.

Мое мнение до сих пор

Модель актора кажется подходящей для первой части моего приложения (получение запроса на поиск подходящей собаки для человека), поскольку у нее есть собственное состояние, которым она управляет на основе ответов, которые она получает от своих дочерних акторов / потоков / чего угодно.

Однако работникам, которые на самом деле проводят проверки, не требуется внутреннее состояние, поскольку они просто проверяют, есть ли некоторая информация о человеке в списке XYZ или дом этого человека больше, чем X. (Так не очень хорошее использование актеров)

Следовательно: является ли модель акторов излишней для моего приложения? Что я должен использовать вместо? Просто фьючерсы? Если я использую модель акторов, следует ли мне использовать кластеризацию Akka? Являются ли потоки Akka альтернативой?

Я весьма озадачен!


person kajafls    schedule 17.09.2020    source источник


Ответы (1)


Актеры akka отлично подходят для управления состоянием в приложении. В вашем случае состояние может быть кэшировано в результате этих запросов:

... данные об этом человеке из других систем (где он живет, какое у него место, время, насколько он спортивный и т. д.)

Кэширование этих данных в памяти приложения и использование акторов для этих данных в памяти - хорошее применение, если вы хотите выполнять эти запросы как можно быстрее.

Для выполнения проверки вам подойдут потоки akka и графический DSL.

val ask1 = Flow[Req].mapAsync(1) { req =>
  someActorRef ? req
}
val ask2 = ...

val bcast = b.add(Broadcast[Req](N))
val zip = b.add(Zip(...))
bcast.out(0) ~> ask1 ~> zip.in0
bcast.out(1) ~> ask2 ~> zip.in1
...

Не стесняйтесь читать https://doc.akka.io/docs/akka/current/stream/stream-graphs.html, чтобы узнать больше о потоках akka. Его можно легко интегрировать с акторами akka и akka http.

Кластер Akka или нет - это другой вопрос, определенно требуется дополнительная информация для принятия решения, например, насколько велика база пользователей.

person Yik San Chan    schedule 17.09.2020
comment
Спасибо за ваш вклад! Я посмотрю на потоки акка и график DSL. Мое впечатление о кластере akka таково, что его рекомендуется использовать, когда у вас будет несколько узлов, чтобы кластер akka мог управлять ими за вас, вместо того, чтобы управлять ими самостоятельно. Скажем, я хотел бы запустить 3 реплики своего приложения, и я хочу, чтобы они выполняли работу в зависимости от их возможностей. Скажем, у меня будет около 20 запросов в секунду, каждый из которых приведет к 100 проверкам. Также: после того, как собака была определена, состояние о человеке может быть отброшено всеми участниками. - person kajafls; 18.09.2020
comment
Кластер Yah Akka хорошо подходит для определенных вариантов использования (например, для синхронизации данных между узлами), но он определенно вносит сложность и требует обучения. Наслаждайтесь приключениями! - person Yik San Chan; 18.09.2020
comment
Кстати, не возражаете принять ответ? Спасибо - person Yik San Chan; 18.09.2020