LINUX.ORG.RU

WebSocket помогите разобраться

 ,


0

1

Приветствую, неважно зачем, но пытаюсь сделать возможными вебсокеты в nginx/openresty. В node.js все просто до невозможности, а с nginx'ом проблема. На сервере сдандартной для ws библиотекой сделал handshake и сервер ждет когда клиент что-то спросит, то есть соединение с браузером открыто. Есть хост и порт клиента. Порт имею в виду автоматом браузер открывает для соединения, например 49264. И главное - что это соединение использовать больше нельзя! Потому что в других nginx воркерах, к большой моей печали, никаким образом не выйдет получить доступ к соединению из другого воркера. Ещё раз, в браузере соединение открыто, есть адрес браузера 127.0.0.1:49264. Как теперь мне можно с помощью curl отправить тестовое сообщение браузеру? Или не curl, пусть что угодно, если тестовое дойдет буду счастлив.


Зачем курл? Что мешает той де нодой отправить? Ты нгинкс спроксировал на свой ws сервер?

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

Можно и нодой, без разницы, если хоть чем то получится то смогу к себе туда на луа переписать. nginx ничего не проксирует, он и есть веб сервер

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

Потому что иначе либо будет только 1 воркер, либо систему pub/sub нельзя реализовать. В этой тестовой имплементации так и написано: https://bitbucket.org/sirpengi/openresty-chat/src/2ca4e91d986b1b1021a1234ae7a... worker_processes 1; Так дело не пойдет. По этому сижу читаю учебник по си и попробую openresty допилить, имхо у проекта большое будущее.

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

В тестовой имплементации так написано, потому что это тестовая имплементация. Воркеров может быть сколько угодно. Сокеты нельзя шэрить - это да (на самом деле можно, но очень осторожно), но это и не требуется.
Но ты читай, читай, лол.

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

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

http://faye.jcoglan.com/ - посмотри тут архитектуру, полезно для общего развития.

Насчет как курлом отправлять - дык надо еще http-сервер поднимать, который обычные запросы схавает и перебросит на вебсокеты. Можно конечно все в кучу свалить, но по смыслу вещи независимие.

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

Честное слово, там 1 воркер потому, что если будет два то не выгорит дело. Как можно? Правда можно шэрить сокеты? Если да, то было бы великолепно.

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

В данном случае есть postgres, внутри nginx есть shared.dict, который по сути хеш значений. Сохранить не проблема, дело в другом: как узнать, что строка в бд изменилась или добавилась? Не делать же бесконечный интервал для проверки. Кстати, бесконечный интервал пока единственное решение.

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

Ну смысл именно в этом. Тебе в каждом процессе нужна подписка на все апдейты. Будешь ли ты слушать евенты как в редиске, или запросы передергивать - суть не меняет.

Не знаю, есть ли конкретно в посгресе фича подписаться на апдейт таблицы.

Vit ★★★★★
()
Последнее исправление: Vit (всего исправлений: 1)
Ответ на: комментарий от Vit

Не знаю, есть ли конкретно в посгресе фича подписаться на апдейт таблицы.

Например, pg_notify в триггере в нужный канал.

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

Можно, но не нужно. Нарвешься на адовые race-condition.
Тебе уже выше сказали - общаться через внешний сервис. Делаешь два треда - один слушает сокет и пишет в базу, второй слушает базу и пишет в сокет.

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