DEV Community на русском
Подписаться
Создание распределенных систем на Elixir: Часть 6 — Именованные процессы
Этот текст объясняет ограничения использования PID процессов в качестве публичных интерфейсов и представляет именованные процессы как решение для обнаруживаемых адресов. Когда рабочий процесс выходит из строя и перезапускается, он получает новый PID, что делает старый PID недействительным. Отправка сообщений мертвому локальному PID не вызывает ошибки и не перезапускает процесс. Для решения этой проблемы клиенты могут полагаться на имя и разрешать его при отправке сообщений вместо использования PID.В статье демонстрируются два метода именования процессов: локальная регистрация и глобальная регистрация. Process.register/2 регистрирует PID с именем в текущем узле BEAM, доступном через Process.whereis/1. Сообщения могут отправляться непосредственно по зарегистрированному имени, которое среда выполнения разрешает в текущий PID. Однако Process.register/2 является локальным для узла, что означает, что одно и то же имя на разных узлах относится к разным процессам.Для поиска по всему кластеру используется модуль Erlang :global. :global.register_name/2 и :global.whereis_name/1 позволяют регистрировать и искать имена на подключенных узлах. Третий пример показывает, как скрыть PID от клиентов, заставив рабочий процесс зарегистрироваться и вернуть свое публичное имя. Затем клиент отправляет запросы по имени, а не по PID.Важно отметить, что именование процессов не решает проблему надзора или управления жизненным циклом; оно только решает проблему обнаружения. Когда зарегистрированный процесс завершается, его регистрация удаляется, и замена должна быть запущена и повторно зарегистрирована. Одно имя обычно относится к одному владельцу, что делает его непригодным для пулов рабочих процессов без дополнительных механизмов маршрутизации. Рекомендуется коррелировать ответы с использованием уникальных ссылок для клиентов с несколькими активными запросами. Наконец, регистрация :global облегчает работу с распределенными системами, но не устраняет такие проблемы, как сетевые разделения или одновременные заявки. Основная представленная идея заключается в использовании имен процессов для ролей служб, а не временных PID, для построения устойчивых систем.