Я работаю над диссертационным проектом, который должен быть сервером Minecraft, написанным на scala и Akka. Сервер должен легко развертываться в облаке или кластере (не уверен, что я использую правильную терминологию ... он должен работать на нескольких узлах). Я, однако, новичок в Акке, и мне было интересно, как реализовать такую вещь. Проблема, которую я пытаюсь выяснить прямо сейчас, заключается в том, как разделить состояние между участниками на разных узлах. Моей первой идеей было создать актера Camel, который будет считывать tcp-поток с клиентов Minecraft, а затем отправлять его на балансировщик нагрузки, который выберет узел, который обработает запрос, а затем отправит некоторый ответ клиенту через tcp. Допустим, у меня есть актер, реализующий AuthenticationService, который проверяет, действительны ли предоставленные пользователем учетные данные. У каждого узла будет такой актер (или, возможно, их больше), и у всех актеров должна быть постоянно одна и та же база данных (или состояние) пользователей. У меня вопрос, каков наилучший способ сохранить это состояние? Я придумал несколько решений, о которых мог бы подумать, но я не сделал ничего подобного, поэтому, пожалуйста, укажите на недостатки:
Решение № 1: Сохранить состояние в базе данных. Это, вероятно, будет очень хорошо работать для этого примера аутентификации, где состояние представлено только чем-то вроде списка имен пользователей и паролей, но, вероятно, не будет работать в тех случаях, когда состояние содержит объекты, которые не могут быть легко разбиты на целые числа и строки.
Решение № 2: Каждый раз, когда поступает запрос к определенному субъекту, который изменит его состояние, субъект после обработки запроса передает информацию об изменении всем другим субъектам того же типа, которые будут менять их состояние в соответствии с информацией, отправленной оригинальным актером. Это кажется очень неэффективным и довольно неуклюжим.
Решение № 3: Наличие определенного узла служит своего рода узлом состояния, в котором будут присутствовать акторы, представляющие состояние всего сервера. Любой другой актер, кроме актеров в таком узле, не будет иметь состояния и будет запрашивать актеров в «узле состояния» каждый раз, когда им понадобятся некоторые данные. Это также кажется неэффективным и не защищенным от ошибок.
Итак, вот оно. Единственное решение, которое мне действительно нравится, это первое, но, как я уже сказал, оно, вероятно, работает только в очень ограниченном подмножестве проблем (когда состояние может быть разбито на структуры redis). Любой ответ от более опытных гуру будет очень ценным.
С уважением, Томас Герман