2015-02-12 4 views
4

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

Теперь у меня проблема с серверами веб-узлов, обсуждающими друг с другом. Например:

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

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

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

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

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

ответ

0

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

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