Как отправить сообщение в модуль обратного вызова веб-сокета в yaws/Erlang

Как отправить сообщение функции обратного вызова handle_message модуля обратного вызова web-socket, чтобы обновить его InternalState из другого модуля обратного вызова web-socket??


person Community    schedule 20.12.2016    source источник


Ответы (2)


Если вы хотите, чтобы процессы обратного вызова веб-сокета Yaws знали о других таких процессах, вам придется самостоятельно создать какой-то реестр. Процессы веб-сокетов Yaws не зарегистрированы, потому что Yaws не нужно их находить; каждый связан с сокетом, и действия в соответствующих сокетах — это то, как их сообщения попадают к ним.

Одним из способов реализации такого реестра может быть вызов функции инициализации модуля обратного вызова веб-сокета erlang:register/2, но этот подход страдает от проблемы необходимости нового имени атома для каждого процесса обратного вызова, и если ваш сервер работает достаточно долго, вы закончите атомов и сломать виртуальную машину Erlang.

Лучший подход — создать процесс реестра gen_server, который управляет таблицей ets, а затем зарегистрировать функцию инициализации модуля обратного вызова веб-сокета в этом процессе, который затем сохранит детали в таблице ets. Процесс обратного вызова может найти другой либо путем прямого доступа к таблице ets (при условии, что она разрешает общедоступное чтение), либо путем вызова функции запроса в процессе реестра, хотя обратите внимание, что в последнем случае, если такие вызовы часты и имеется много websocket, реестр может быть узким местом.

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

Если вы не используете Yaws во встроенном режиме, вы можете использовать yapps функцию Yaws для запустите собственное приложение, работающее совместно с Yaws, чтобы запустить супервизор, который затем запускает и управляет процессом реестра. В этом случае нет необходимости регистрировать yapp на каждом виртуальном сервере, как предполагает документация, поскольку само yapp не будет обрабатывать запросы Yaws.

person Steve Vinoski    schedule 20.12.2016

У меня похожий подход. Если у вас есть более одного сервера Yaws для обработки веб-сокета, вы можете сохранить Pid веб-сокета в mnesia и использовать Pid ! Message для отправки сообщения на определенный Pid веб-сокета, наконец, будет вызван модуль обратного вызова веб-сокета handle_info/2.

person chengweichao    schedule 04.01.2017