как перенести gen_server / gen_fsm с узла на узел - PullRequest
1 голос
/ 06 марта 2012

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

1 Ответ

1 голос
/ 06 марта 2012

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

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

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

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

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

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

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

...