Открытие акторов Akka в кластере

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

Я попытаюсь проиллюстрировать проблему, используя пример чата WebSocket, поставляемый с Play Framework 2.0: есть актор, который хранит WebSockets и хранит список подключенных в данный момент пользователей. Актеры в основном представляют чат как технически, так и логически. Это прекрасно работает, пока на одном сервере работает один чат.

Теперь я пытаюсь понять, как следует расширить этот пример, когда мы говорим о множестве динамических чатов (новые комнаты можно открывать/закрывать в любое время), работающих на кластере серверов (с отдельными узлами, добавлены или удалены в соответствии с текущим спросом). В таком случае пользователь А может подключиться к серверу 1, а пользователь Б — к серверу 2. Оба могут разговаривать в одном и том же чате. На каждом сервере по-прежнему будет действующее лицо (для каждого чата?), которое содержит экземпляры WebSocket для получения и публикации событий (сообщений) нужным пользователям.Но по логике должен быть только один участник комнаты чата на сервере 1 или сервере 2, который содержит список подключенных в данный момент пользователей (или аналогичные задачи).

Как бы вы собирались добиться этого, предпочтительно в «чистой akka» и без добавления дополнительной системы обмена сообщениями, такой как ZeroMQ или RabbitMQ?

Вот что я придумал на данный момент, пожалуйста, дайте мне знать, имеет ли это какой-либо смысл:

  1. Пользователь A подключается к серверу 1, и выделяется актер, который держит его WebSocket.
  2. Актор проверяет (используя Router? EventBus? Что-то еще?), существует ли «актор комнаты чата» для активной комнаты чата на каком-либо из подключенных узлов кластера. Поскольку это не так, он каким-то образом запросит создание нового актера комнаты чата и будет отправлять и получать будущие сообщения чата от этого актера.
  3. Пользователь B подключается к серверу 2, и для его WebSocket также выделяется актер.
  4. Он также проверяет, существует ли где-либо актор для запрошенной комнаты чата, и находит его на сервере 1.
  5. Актер комнаты чата на сервере 1 теперь действует как концентратор для данной комнаты чата, отправляя сообщения всем «подключенным». актеры-участники чата и распределяющие входящие.

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

Я просматривал документацию Akka уже довольно давно, так что, возможно, я упускаю здесь очевидное.Если это так, пожалуйста, просветите меня :-)

43
задан Hugo Sereno Ferreira 30 April 2013 в 21:09
поделиться