- PVSM.RU - https://www.pvsm.ru -
Для приготовления асинхронных уведомлений из PostgreSQL в websocket нам понадобится сам nginx [1] и его плагины postgres [2], push-stream [3], set-misc [4]. (Я дал ссылки на свои форки, т.к. делал некоторые изменения, которые пока не удалось пропихнуть в оригинальные репозитории. Можно также воспользоваться готовым образом [5].)
Для подключения клиентов к nginx по websocket создадим
location =/websocket {
push_stream_subscriber websocket; # принимаем клиентов по websocket
push_stream_channels_path $arg_id; # задаём имя websocket канала из аргумента id
push_stream_websocket_allow_publish on; # позволяем клиентам что-нибудь публиковать в канал
push_stream_client_subscribed_request /subscribe; # задаём что будет происходить при подключении клиента
push_stream_client_unsubscribed_request /unsubscribe; # задаём что будет происходить при отключении клиента
push_stream_client_publish_request /publish; # задаём что будет происходить при публикации клиентом в websocket
}
При подключении клиента к websocket начинаем слушать асинхронные уведомления в PostgreSQL
location =/subscribe {
internal;
postgres_pass ngx; # задаём подключение к PostgreSQL
set_quote_json_str $channel $arg_id; # экранируем имя канала
postgres_query "listen $channel"; # начинаем слушать асинхронные уведомления
}
При отключении клиента от websocket прекращаем слушать асинхронные уведомления в PostgreSQL
location =/unsubscribe {
internal;
postgres_pass ngx; # задаём подключение к PostgreSQL
set_quote_json_str $channel $arg_id; # экранируем имя канала
postgres_query "unlisten $channel"; # прекращаем слушать асинхронные уведомления
}
При публикации клиентом в websocket выполняем что-нибудь
location =/publish {
internal;
postgres_pass ngx; # задаём подключение к PostgreSQL
postgres_query "select now()"; # выполняем команду в PostgreSQL и возвращаем результат клиенту через websocket
}
Также, можно просто послать что-нибудь клиенту в websocket
location =/publisher {
allow 127.0.0.1/16; # разрешаем только локальные подключения
deny all; # запрещаем все остальные подключения
push_stream_channel_info_on_publish off; # не публикуем в информационные кананлы информацию о публикации
push_stream_publisher; # включаем публикацию
push_stream_channels_path $arg_id; # задаём имя websocket канала из аргумента id
}
Автор: RekGRpth
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nginx/321332
Ссылки в тексте:
[1] nginx: https://github.com/RekGRpth/nginx
[2] postgres: https://github.com/RekGRpth/ngx_postgres
[3] push-stream: https://github.com/RekGRpth/nginx-push-stream-module
[4] set-misc: https://github.com/RekGRpth/set-misc-nginx-module
[5] готовым образом: https://hub.docker.com/r/rekgrpth/nginx
[6] Источник: https://habr.com/ru/post/456672/?utm_source=habrahabr&utm_medium=rss&utm_campaign=456672
Нажмите здесь для печати.