Как перенести gen_server/gen_fsm от узла к узлу

Я хотел бы знать, каков предлагаемый способ (если таковой имеется) для перемещения gen_server/gen_fsm из узла erlang A в узел erlang B, сохраняя его внутреннее состояние.

1 ответ

Решение

На самом деле, нет способа передать процесс между узлами erlang, и я могу придумать множество причин, чтобы запретить это, а между остальными вы можете связываться с памятью внутренних узлов, просто рассмотрите процесс, который хранит данные (кроме внутреннего цикла 'State'). параметр) в словаре процесса (куча процесса), двоичном (другой метод сбора мусора).

Одним из обходных путей может быть предоставление gen_fsm / gen_server метода, который может порождать новый процесс, воссоздавая в то же время внутреннее состояние сервера / конечного автомата. Я думаю, что сложнее сказать, что для реализации вы можете просто использовать две функции запуска:

  • тот, который инициализирует поведение (как я думаю, вы делаете сейчас)
  • тот, который также принимает узел и запускается через удаленный метод, вызывает сервер на этом узле и инициализирует состояние (с помощью функции init / 1 или явным образом, отправляя сообщение, то есть состояние сервера)

Но должен сказать, что вижу здесь две основные проблемы:

  • Синхронизация: нужно убедиться, что процесс: запустить сервер на удаленном узле -> установить состояние удаленного сервера -> уничтожить текущий локальный сервер на атомарном
  • Согласованность: другие процессы, относящиеся к локальному, должны переключать свои ссылки на удаленные.

Первый может быть решен разными способами (два моих цента: явная передача сообщений между локальным и удаленным сервером - накладные расходы, но пуленепробиваемые, учитывая систему времени исполнения Erlang), последний может быть решен с помощью монитора / ссылок и возвращаемых значений выхода (pid удаленного сервера) или более элегантным способом с моделью публикации / подписки с процессом gen_event.

Я надеюсь, что вы найдете это полезным, чтобы решить вашу проблему и спросить что-нибудь, если вам нужно!

Другие вопросы по тегам