Я хотел бы знать, каков предложенный способ (если таковой имеется) для перемещения gen_server / gen_fsm с узла A Erlang на узел B Erlang с сохранением его внутреннего состояния.
как перенести gen_server / gen_fsm с узла на узел
Ответы (1)
AFAIK нет способа передать процесс между узлами erlang, и я могу подумать о многих причинах, чтобы запретить это, между другими вы можете испортить внутреннюю память узлов, просто рассмотрите процесс, который хранит данные (кроме внутреннего цикла `` Состояние '' параметр) в словаре процесса (куча процесса), двоичный (другой метод сборки мусора).
Одним из обходных путей может быть предоставление gen_fsm / gen_server метода, который может порождать новый процесс, одновременно воссоздающий внутреннее состояние сервера / конечного автомата. Я думаю, что сложнее сказать, что для реализации можно было бы просто использовать две стартовые функции:
- тот, который инициализирует поведение (как я думаю, вы делаете прямо сейчас)
- тот, который также принимает узел и запускается через удаленный метод, вызывает сервер на этом узле и инициализирует состояние (с помощью функции init / 1 или явным образом путем отправки сообщения, то есть состояния сервера)
Но должен сказать, что вижу здесь две основные проблемы:
- Синхронизация: нужно убедиться, что процесс: запустить сервер на удаленном узле -> установить состояние удаленного сервера -> убить текущий локальный сервер является атомарным
- Когерентность: другие процессы, относящиеся к локальному, должны переключить свою ссылку на удаленный
Первый может быть решен разными способами (мои два цента: явная передача сообщений между локальным и удаленным сервером - накладные расходы, но пуленепробиваемые, учитывая систему времени выполнения Erlang), последнее может быть разрешено с помощью монитора / ссылок и выходных возвращаемых значений (идентификатор удаленного сервера) или более элегантным способом с моделью публикации / подписки с процессом gen_event.
Я надеюсь, что вы найдете это полезным для решения вашей проблемы и спросите что-нибудь, если вам нужно!