LINUX.ORG.RU

Можно ли в nginx создать запрос?

 , , ,


0

1

Имеются два модуля nginx: один работает с веб-сокетами, а второй с базой данных постгрес.

Чтобы отправить сообщение в веб-сокет - надо выполнить запрос на определённый location (первого модуля)

Второй же модуль может получать от базы асинхронные уведомления (listen/notify)

И теперь надо как-то при получении асинхронного уведомления во втором модуле как-то создать запрос, который вызовет location первого модуля, чтобы тот отправил данные в веб-сокет

Можно ли это как-то сделать? В какую сторону копать?

Ответ на: комментарий от Deleted

если lua - тогда уж лучше использовать tarantool

RekGRpth
() автор топика

В какую сторону копать?

В сторону скриптования? Его ж можно скриптовать с помощью Lua/MRuby, если собрать с поддержкой соответствующих модулей.

theNamelessOne ★★★★★
()

дернуть локейшен можно через njs легко. но только в процессе обработки какого-то запроса.

зачем второй модуль с listen/notify непонятно. почему просто не дернуть сокет нжинкса внешним процессом?

drsm ★★
()
Последнее исправление: drsm (всего исправлений: 1)

Для HTTP-подзапросов есть ngx_http_subrequest(). Скорее всего, у полученного ngx_http_request_t * ты захочешь поменять ->write_event_handler на что-то своё.

i-rinat ★★★★★
()
Ответ на: комментарий от drsm

njs

не хочу ничего лишнего

зачем второй модуль с listen/notify непонятно. почему просто не дернуть сокет нжинкса внешним процессом?

нету у меня никаких внешних процессов! есть nginx с вебсокетами, который соединён listen/notify с postgres, в котором крутятся очереди (pgq)

RekGRpth
() автор топика
Ответ на: комментарий от Sorcerer

На сишке?

как раз - да!

У nginx как раз для этого есть сабреквесты.

знаю, но проблема как раз в том, что реквеста-то нету! и надо его как-то создать!

RekGRpth
() автор топика
Ответ на: комментарий от i-rinat

Для HTTP-подзапросов есть ngx_http_subrequest(). Скорее всего, у полученного ngx_http_request_t * ты захочешь поменять ->write_event_handler на что-то своё.

дак проблема как раз в том, что ngx_http_request_t нету! и надо его как-то создать!

RekGRpth
() автор топика
Ответ на: комментарий от i-rinat

ngx_http_subrequest() инициализирует новый ngx_http_request_t.

инициализировать-то - инициализирует, но у этой функции первый аргумент - это старый ngx_http_request_t, а его у меня нет!

RekGRpth
() автор топика
Ответ на: комментарий от RekGRpth

не хочу ничего лишнего

BTW это стандатный модуль.

нету у меня никаких внешних процессов! есть nginx с вебсокетами, который соединён listen/notify с postgres, в котором крутятся очереди (pgq)

есть n worker процессов, обрабатывающих входящие запросы, как они у тебя соединены с сокетом на котором ты делаешь listen(от постгреса)?

drsm ★★
()
Ответ на: комментарий от drsm

есть n worker процессов, обрабатывающих входящие запросы, как они у тебя соединены с сокетом на котором ты делаешь listen(от постгреса)?

    location = /ws {
        push_stream_subscriber websocket;
        push_stream_channels_path $arg_id;
    }
    location = /pub {
        push_stream_publisher;
        push_stream_channels_path $arg_id;
    }
    location = /client_unsubscribed {
        internal;
        postgres_pass ngx;
        postgres_query "unlisten $arg_id";
    }
    location = /client_subscribed {
        internal;
        postgres_pass ngx;
        postgres_query "listen $arg_id";
    }

браузер соединяется вебсокетом на ws, первый модуль шлёт подзапрос на client_subscribed, второй модуль шлет listen в постгрес

RekGRpth
() автор топика
Ответ на: комментарий от RekGRpth

То есть ты это как бы сам по себе делаешь, без привязки к какому-либо запросу? В таком случае сабреквестами воспользоваться не получится. Используй тогда ngx_add_conn() и ngx_add_event(). Указатель на ngx_connection_t можно получить с помощью ngx_get_connection(). Дальше устанавливаешь колбеки на read и write, и работаешь уже там.

Пример инициализации есть в коде ngx_event_accept().

i-rinat ★★★★★
()
Ответ на: комментарий от RekGRpth

браузер соединяется вебсокетом на ws...
...шлет listen в постгрес

это не будет работать.

что толку от listen, кто потом будет слушать асинхронные нотификации на этом соединении пг?

соединений pg походу там == числу workerов, кто гарантирует что в одном воркере будут обработаны /ws и /client_subscribed

итд...

drsm ★★
()
Ответ на: комментарий от drsm

это не будет работать.

уже работает! но с помощью curl_easy

что толку от listen, кто потом будет слушать асинхронные нотификации на этом соединении пг?

второй модуль и слушает!

RekGRpth
() автор топика
Ответ на: комментарий от RekGRpth

Наверное, да. Зависит от того, чего ты пытаешься добиться.

Но если бы у меня была задача наладить коммуникации между двумя модулями, я бы стал задумываться, а в чём на самом деле задача. Если у тебя код в двух модулях решает общую задачу, связан между собой и требует коммуникации, не стоило разбивать его на два модуля. Стоило делать сразу один цельный.

Нет смысла сначала придумывать себе задачу на ровном месте, а потом хаками пытаться её решить.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

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

RekGRpth
() автор топика
Ответ на: комментарий от drsm

где в готовом ngx_postgres поддержка listen/notify

добавить всего пару строк вот докер, в докерфайле - ссылки на исходники, где я и добавил эту поддержку

RekGRpth
() автор топика
Ответ на: комментарий от RekGRpth

Тогда всё равно можно решить, но придётся вникнуть в стройную костылеподпорочную систему nginx. У nginx все их структуры публичные, так что даже если они не экспортировали какие-то нужные функции, то никто не мешает заняться творческим копипастингом.

Sorcerer ★★★★★
()
Ответ на: комментарий от RekGRpth

Всегда можно создать сокет самому и сидеть на read/write событиях. Возможно, есть какой-то способ попроще, но найдётся он в процессе реализации.

i-rinat ★★★★★
()
Ответ на: комментарий от RekGRpth

я почитал твой код, поддержкой это врятли можно назвать, скорее ты похакал этот модуль ).

но. мне непонятно, что ты достичь пытаешься?

ведь если так делать (неважно через nginx или curl), то на КАЖДЫЙ notification будут открываться по два сокета, этож на одних сисколах оверхед эпический...

drsm ★★
()
Ответ на: комментарий от RekGRpth

получилось сделать, но без запроса! (с помощью глобальной переменной и вызова функции первого модуля из второго)

RekGRpth
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.