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 ★★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.