Храповое соединение нескольких серверов

Я использую Ratchet (http://socketo.me/) для веб-сокетов в моем приложении PHP. У меня есть несколько виртуальных машин, на которых запущено приложение, и на каждой из этих машин также размещается служба websocket. Запросы передаются на одну из этих виртуальных машин через HAProxy. Также в настоящее время пользователь использует службу websocket на том же узле, к которому он подключается для приложения.

Теперь у меня проблема с тем, что серверы websocket обсуждают друг с другом. Например:

  • user1 подключается к node1, а user2 подключается к node2
  • User1 отправляет сообщение websocket через websocket пользователю user2
  • Пользователь2 никогда не получает это сообщение, потому что он подключен к другому узлу

Каковы передовые методы обмена сообщениями такого типа? У меня есть идеи, но я не знаю, по какому пути идти:

  1. Каждый клиент подключается к каждому узлу веб-сокета.
  2. Серверы также публикуют сообщения для всех остальных узлов.
  3. Используйте базу данных для синхронизации сообщений между узлами

И 1-й, и 2-й варианты не очень масштабируемы, если к облаку подключены новые узлы. 3-й вариант вызовет некоторую задержку, потому что необходимо в цикле проверять, находятся ли сообщения от других узлов в базе данных.

Есть ли другие способы справиться с подобными ситуациями? Спасибо за ответы!


person drodil    schedule 12.02.2015    source источник


Ответы (1)


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

  • Вы можете использовать Redis как очень быструю базу данных, которая реализует списки - rpush, llen, lrange. Это удивительно эффективно справится с синхронизацией между серверами.
  • Не отправляйте сообщения напрямую в обработчике onMessage, а лучше помещайте сообщения прямо в Redis. Таким образом, обработчик работает очень быстро.
  • Вместо того, чтобы позволять Ratchet создавать собственный цикл, создайте его вручную и добавьте к нему периодический таймер, который опрашивает Redis и отправляет новые сообщения клиентам.
person Michał Tatarynowicz    schedule 19.12.2017
comment
Я хотел бы знать, как бы вы сохранили объект подключения в Redis? - person Airy; 05.05.2020