Как отправить сообщение функции обратного вызова handle_message
модуля обратного вызова web-socket, чтобы обновить его InternalState
из другого модуля обратного вызова web-socket??
Как отправить сообщение в модуль обратного вызова веб-сокета в yaws/Erlang
Ответы (2)
Если вы хотите, чтобы процессы обратного вызова веб-сокета Yaws знали о других таких процессах, вам придется самостоятельно создать какой-то реестр. Процессы веб-сокетов Yaws не зарегистрированы, потому что Yaws не нужно их находить; каждый связан с сокетом, и действия в соответствующих сокетах — это то, как их сообщения попадают к ним.
Одним из способов реализации такого реестра может быть вызов функции инициализации модуля обратного вызова веб-сокета erlang:register/2
, но этот подход страдает от проблемы необходимости нового имени атома для каждого процесса обратного вызова, и если ваш сервер работает достаточно долго, вы закончите атомов и сломать виртуальную машину Erlang.
Лучший подход — создать процесс реестра gen_server
, который управляет таблицей ets
, а затем зарегистрировать функцию инициализации модуля обратного вызова веб-сокета в этом процессе, который затем сохранит детали в таблице ets
. Процесс обратного вызова может найти другой либо путем прямого доступа к таблице ets
(при условии, что она разрешает общедоступное чтение), либо путем вызова функции запроса в процессе реестра, хотя обратите внимание, что в последнем случае, если такие вызовы часты и имеется много websocket, реестр может быть узким местом.
Второй подход позволяет вам использовать ключи, отличные от атомов, такие как строки, целые числа или двоичные числа, и поэтому он не страдает от проблемы исчерпания атомов. Еще одним преимуществом является то, что процесс реестра может отслеживать каждый зарегистрированный процесс обратного вызова веб-сокета и удалять их из реестра, когда они умирают.
Если вы не используете Yaws во встроенном режиме, вы можете использовать yapps
функцию Yaws для запустите собственное приложение, работающее совместно с Yaws, чтобы запустить супервизор, который затем запускает и управляет процессом реестра. В этом случае нет необходимости регистрировать yapp на каждом виртуальном сервере, как предполагает документация, поскольку само yapp не будет обрабатывать запросы Yaws.
У меня похожий подход. Если у вас есть более одного сервера Yaws для обработки веб-сокета, вы можете сохранить Pid веб-сокета в mnesia и использовать Pid ! Message
для отправки сообщения на определенный Pid веб-сокета, наконец, будет вызван модуль обратного вызова веб-сокета handle_info/2
.