В настоящее время я изучаю Erlang в разумных пределах, но у меня есть вопрос о gen_server с руководителями. Если процесс gen_server дает сбой и впоследствии перезапускается супервизором, он получает новый pid. А что, если я хочу, чтобы другие процессы ссылались на этот процесс по Pid? Какие есть хорошие идиоматические способы «обновить» Pid в этих процессах?
В качестве упражнения с некоторым практическим применением я пишу сервер блокировки, где клиент может запросить блокировку с помощью произвольного ключа. В идеале я хотел бы, чтобы отдельные процессы обрабатывали блокировку и снятие конкретной блокировки, идея в том, что я могу использовать аргумент тайм-аута в gen_server для завершения процесса, если никто не запросил его через N количество времени, так что только в настоящее время соответствующие блокировки останутся в памяти. Теперь у меня есть процесс каталога, который сопоставляет имя блокировки с процессом блокировки. Когда процесс блокировки завершается, он удаляет блокировку из каталога.
Меня беспокоит, как поступить в случае, когда клиент запрашивает блокировку, когда процесс блокировки находится в процессе завершения. Он еще не выключился, поэтому нюхать, что pid жив, не получится. Процесс блокировки еще не достиг предложения, которое удаляет его из каталога.
Есть ли лучший способ справиться с этим?
ИЗМЕНИТЬ
В настоящее время существует два gen_servers: «каталог», который поддерживает таблицу ETS из LockName -> Lock Process, и «lock server», которые динамически добавляются в дерево наблюдения с помощью start_child. В идеале я хотел бы, чтобы каждый сервер блокировки обрабатывал общение с клиентами напрямую, но меня беспокоит сценарий, когда запрос на получение/освобождение выдается с помощью вызова или приведения, когда процесс находится в середине сбоя (и, следовательно, не будет отвечать к сообщению).
Начать с {local} или {global} не получится, так как их может быть N.