Рецепты Nginx: асинхронные уведомления из PostgreSQL в websocket

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Для приготовления асинхронных уведомлений из PostgreSQL в websocket нам понадобится сам nginx и его плагины postgres, push-stream, set-misc. (Я дал ссылки на свои форки, т.к. делал некоторые изменения, которые пока не удалось пропихнуть в оригинальные репозитории. Можно также воспользоваться готовым образом.)

Для подключения клиентов к 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
}
Источник: https://habr.com/ru/post/456672/


Интересные статьи

Интересные статьи

«Просто так» результат SQL-запроса возвращает записи в том порядке, который наиболее удобен серверу СУБД. Но человек гораздо лучше воспринимает хоть как-то упорядоченные данные — это ...
Привет, друзья! Меня зовут Петр, я представитель малого белорусского бизнеса со штатом чуть более 20 сотрудников. В данной статье хочу поделиться негативным опытом покупки 1С-Битрикс. ...
Как быстро определить, что на отдельно взятый сайт забили, и им никто не занимается? Если в подвале главной страницы в копирайте стоит не текущий год, а старый, то именно в этом году опека над са...
Меня зовут Эдуард Мацуков, я делаю Таксометр — приложение для водителей Яндекс.Такси. Занимаюсь инфраструктурой и всем, что с ней связано. Какое-то время назад я выступил с докладом — рассказал о...
Основанная в 1998 году компания «Битрикс» заявила о себе в 2001 году, запустив первый в России интернет-магазин программного обеспечения Softkey.ru.