В последнее время я пытался замалчивать концепцию Акка и актерских систем. В то время как у меня есть довольно хорошее понимание основ Akka, теперь Im все еще борется с некоторыми вещами, когда дело доходит до кластеров и удаленных участников.
Попытайтесь проиллюстрировать проблему, используя пример чата WebSocket, который поставляется с Play Framework 2.0: там есть актер, который содержит WebSockets и который хранит список текущих подключенных пользователей. Актеры в основном представляют чат-комнату как технически, так и логично. Это работает отлично, если только один чат работает на одном сервере.
Теперь я пытаюсь понять, как этот пример должен быть расширен, когда мы говорим о многих динамических чатах (в любой момент можно открывать/закрывать новые комнаты), работающие на кластере серверов (с единственными узлами, которые добавляется или удаляется в соответствии с текущим спросом). В таком случае пользователь A может подключиться к серверу 1, когда пользователь B подключается к серверу 2. Оба могут разговаривать в одной комнате чата. На каждом сервере все равно будет актер (для каждой комнаты чата?), Который содержит экземпляры WebSocket для приема и публикации событий (сообщений) для нужных пользователей. Но логически на одном сервере 1 или сервере 2 должен присутствовать только один участник чата, в котором содержится список подключенных пользователей (или подобных задач).
Как вы собираетесь достичь этого, желательно в "чистой акке" и без добавления дополнительной системы обмена сообщениями, такой как ZeroMQ или RabbitMQ?
Вот что я до сих пор придумал, пожалуйста, дайте мне знать, имеет ли это смысл:
- Пользователь A подключается к серверу 1 и выделяется актер, который хранит его WebSocket.
- Актер проверяет (используя Router? EventBus? Что-то еще?) существует ли "чат-актер" для активного чата на любом из подключенных узлов кластера. Так как он этого не сделает, он попросит создать новый чат-актер как-то и отправит и получит будущие сообщения в чате от этого актера.
- Пользователь B подключается к серверу 2, а актер также выделяется для своего WebSocket.
- Он также проверяет, существует ли какой-либо объект для запрашиваемой комнаты чата и находит его на сервере 1.
- Актер чата на сервере 1 теперь выступает в качестве концентратора для данного чата, отправляет сообщения всем "подключенным" участникам чата и распределяет входящие.
Если сервер 2 идет вниз, актер чата должен быть повторно создан на/перемещен на сервер 2 каким-то образом, хотя сейчас это не моя основная проблема. Мне больше всего интересно узнать, как это динамическое открытие актеров распространилось по различным, в основном независимым машинам, с помощью инструментария Akkas.
Я смотрел документацию Аккаса уже довольно давно, так что, возможно, я пропустил здесь очевидное. Если да, пожалуйста, просветите меня: -)