Недавно я пытался осмыслить концепции Akka и систем, основанных на акторах. Хотя я довольно хорошо понимаю основы Akka, я все еще борюсь с некоторыми вещами, когда дело доходит до кластеризации и удаленных субъектов.
Я попытаюсь проиллюстрировать проблему, используя пример чата WebSocket, поставляемый с Play Framework 2.0: есть актор, который хранит WebSockets и хранит список подключенных в данный момент пользователей. Актеры в основном представляют чат как технически, так и логически. Это прекрасно работает, пока на одном сервере работает один чат.
Теперь я пытаюсь понять, как следует расширить этот пример, когда мы говорим о множестве динамических чатов (новые комнаты можно открывать/закрывать в любое время), работающих на кластере серверов (с отдельными узлами, добавлены или удалены в соответствии с текущим спросом). В таком случае пользователь А может подключиться к серверу 1, а пользователь Б — к серверу 2. Оба могут разговаривать в одном и том же чате. На каждом сервере по-прежнему будет действующее лицо (для каждого чата?), которое содержит экземпляры WebSocket для получения и публикации событий (сообщений) нужным пользователям.Но по логике должен быть только один участник комнаты чата на сервере 1 или сервере 2, который содержит список подключенных в данный момент пользователей (или аналогичные задачи).
Как бы вы собирались добиться этого, предпочтительно в «чистой akka» и без добавления дополнительной системы обмена сообщениями, такой как ZeroMQ или RabbitMQ?
Вот что я придумал на данный момент, пожалуйста, дайте мне знать, имеет ли это какой-либо смысл:
Если сервер 2 выйдет из строя, актор комнаты чата придется каким-то образом воссоздать/переместить на сервер 2, хотя сейчас это не является моей основной задачей. Меня больше всего интересует, как это динамическое обнаружение акторов, распространяющихся на различные, в основном независимые машины, может быть выполнено с помощью набора инструментов Akka.
Я просматривал документацию Akka уже довольно давно, так что, возможно, я упускаю здесь очевидное.Если это так, пожалуйста, просветите меня :-)