#java #scala #actor #akka
#java #scala #актер #akka
Вопрос:
Я хотел бы развернуть программное обеспечение удаленных участников, созданное с помощью akka, в кластере. Система состоит из нескольких рабочих узлов и одного главного узла. Проблема в том, что я не могу заранее знать IP-адрес узлов кластера (но я знаю, что все они являются частью одной и той же подсети). Итак, мне нужен хороший способ определения IP-адресов всех после запуска, чтобы создать правильные ссылки на участников на каждом узле.
Я ищу облегченное решение (оно мне просто нужно для начальной настройки), распространяемое под любой лицензией на свободное программное обеспечение.
Ответ №1:
Некоторое время назад я создал прототип, который предназначен для решения вашей проблемы (не стесняйтесь повторно использовать код и / или вносить свой вклад).
Несколько слов о том, как это работает. Запускает удаленного участника для каждого реестра участников (= узла). RegistryActor содержит ссылки на все другие реестры, запущенные в распределенной установке. Когда в систему добавляется новый узел, ему необходимо знать по крайней мере об одном другом узле (ActorRegistry) и уведомлять его. ActorRegistry затем сообщает всем другим узлам о новом (таким образом, любой RegistryActor имеет ссылки на все другие RegistryActor) и запускает процесс обмена ссылками на участников — в конце этого все реестры участников имеют ссылки на всех участников (локальных или удаленных), запущенных в системе.
Для получения более подробной информации, пожалуйста, обратитесь к этому сообщению в блоге.
Ответ №2:
Взгляните на jgroups.
Он соответствует всем вашим критериям — это легкий, с открытым исходным кодом и очень зрелый, стабильный продукт.
Вы можете легко настроить его для автоматического управления группами и обнаружения на основе ваших требований — он поддерживает практически любую конфигурацию сети — вы можете использовать многоадресную рассылку, общий файл или одноадресную рассылку для обнаружения членов группы.
Комментарии:
1. Тоже хороший ответ. Я пробовал jgroups в прошлом, и я был удовлетворен.
Ответ №3:
Если все узлы не имеют общих знаний, я думаю, что вашему решению придется полагаться на IP-трансляцию. Широковещательная передача определяется как отправка пакета всем сетевым узлам в подсети, поэтому, если ваш главный узел выполняет это, в то время как все рабочие узлы прослушивают его, вы должны иметь возможность подключить их все, не зная IP-адресов априори.
Я не кодировал это в Scala, но вот довольно читаемый пример того, как транслировать сообщения на java: http://download.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html. Адаптировать его к Scala с использованием тех же классов должно быть просто.