Как соединить rabbitmq и ratchet?

Хотелось бы реализовать такую логику - хотелось бы иметь сокет который принимает соединения(назову его sockListen, для простоты дальнейших разъяснений), и все входящие сообщения отправляет в брокер rabbitmq, так же будут отдельные процессы(p1,p2,p3) которые буду подключатся к rabbitmq, доставать оттуда сообщения как то обрабатывать и отдавать назад клиенту. Проблема возникает на последнем этапе, а именно в отдаче данных назад клиенту. То есть, будет клиент который подключается к сокету sockListen по протоколу ws, и после подключения отправляет данные по этому соединению, обработчик sockListen будет брать ip клиента, и его сообщение и отправлять в rabbitmq. Процессы p1,p2,p3 должны будут вытаскивать все сообщения из rabbitmq как то обрабатывать и каждому клиенту отправлять его назад. Так вот, как мне передать данные назад клиенту с определенным ip, при условии что у него уже есть подключение по ws?
  • Вопрос задан
  • 187 просмотров
Пригласить эксперта
Ответы на вопрос 4
mad_maximus
@mad_maximus
А что, рэтчет не предполагает наличие индивидуального соединения с юзером? Я использую центрифугу и там есть опция, при которой можно отправить в канал конкретному пользователю индивидуальное сообщение, и этот канал строится из имени неймспейса и канала (namespace#channel), где канал - id юзера. Зачем соединяться именно по айпи, разве для неавторизованных пользователей тоже будут уведомления?
Ответ написан
@majstar_Zubr
C++ & gamedev
Можно разделять клиентов на сессии, и работать в рамках сессий. Смотря какие у вас требования к авторизации, выбираете нужную библиотеку или реализацию у конкретного фреймворка, и используя идентификатор сессии отсылаете по нужному подключению.

В самом общем простом случае, для определения сессии достаточно токена с IP, guid/порядковый id и временем создания токена/подключения по ws.

1) клиент подключается по ws
2) генерируется токен
3) кладется в сообщение для очереди воркера
4) воркер consume & works
5) возрващается результат работы с токеном
6) компонент вашей системы, который держит подключение с клиентом (socketListen), выбирается по токену, и шлёт его по ws
7) ...
8) Profit, но с оговорками, что либо генерировать токен на стороне клиента (плохая идея), либо разграничивать 1 socketListener на 1 ws подключение (так себе идея , потому что можно делать так: socketo.me/docs/sessions )

P.S. вопрос не совсем по rabbitmq, а совсем по Websockets php Ratchet)
Ответ написан
morozikkk
@morozikkk Автор вопроса
Не много поменяли логику, но подключение все равно будет одно, без push серверов и прочего. Всем спасибо кто участвовал.
Ответ написан
akubintsev
@akubintsev
Опытный backend разработчик
Ratchet при подключении клиента имеет id соединения с ним. В простейшем случае, когда только один процесс Ratchet, можно использовать этот идентификатор для маркировки задания в пул и возврата результат работы.
Но это плохо масштабируется, поэтому конечно было бы корректнее иметь привязку к session token (очевидно придется прикрутить какой-то middleware). Этот компонент должен иметь информацию о том, к какому процессу подключен сейчас юзер с session token. Очевидно потребуется Redis или типа того, чтобы был общий доступ из разных процессов Ratchet.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
12 июл. 2020, в 19:31
2000 руб./за проект
12 июл. 2020, в 16:53
500 руб./за проект
12 июл. 2020, в 16:28
3000 руб./за проект