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

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

Теперь у меня проблема с обсуждением серверов веб-сокетов друг с другом.
Например:

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

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

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

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

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

4

Решение

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

  • Вы можете использовать Redis как очень быструю базу данных, которая реализует списки — rpush, llen, lrange. Это обеспечит удивительную эффективность синхронизации между серверами.
  • Не отправляйте сообщения непосредственно в обработчик onMessage, а помещайте их прямо в Redis. Таким образом, обработчик очень быстрый.
  • Вместо того чтобы позволить Ratchet создать свой собственный цикл, создайте его вручную и добавьте в него периодический таймер, который опрашивает Redis и отправляет новые сообщения клиентам.
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]