Как SailsJS обрабатывает push-сообщения в подключенные сокеты с большим количеством dyno в Heroku?

У меня есть вопрос о масштабировании приложения SailJS на Heroku.

Настройка:

  • SailJS
  • Kue (система очередей Redis)
  • Подключенные клиенты с помощью сокета io (sailsjs)
  • 2 динамометра (каждый запускает экземпляр SailsJS)
  • CronJob вид процесса

Я хочу автономно запускать непрерывный процесс 'cron', который запускает push-сообщение, которое должно быть отправлено подключенному клиенту socketio. Я знаю, что сокет соединения находятся в Redis, когда это настроено правильно.

Я использую kue для nodejs и запускаю работника для обработки задачи. Рабочий находится в экземпляре SailsJS, чтобы иметь возможность отправлять подключенному клиенту сокета push-сообщение.

Но мне интересно, не каждый экземпляр SailsJS (dyno) имеет одинаковые подключенные сокеты, верно? Другими словами, есть ли у каждого экземпляра SailsJS одни и те же клиенты подключенных сокетов или возможно, что у dyno1 есть набор подключенных клиентов, а у другого dyno - другой набор клиентов?

например:

Heroku Cloud => Cron                      => Kue (Redis)
             => Dyno 1 (SailsJS instance) => client 1
                                          => client 2
             => Dyno 2 (SailsJS instance) => client 3
                                          => client 4

Как можно решить это...:-D?

2 ответа

Чтобы привести к потенциальному ответу:

Кажется, ребята из sails.js сейчас работают над этим! Смотрите: https://github.com/balderdashy/sails/issues/2593

Я надеюсь, что эти парни позволят методу "subscrirs" вести себя так же, как, например, "message ()".

По моему мнению, когда метод: 'message()' позволяет вам отправить сообщение клиенту, подключенному к другому экземпляру паруса, метод 'subscripts ()' должен возвращать подписчиков (идентификаторы сокета), связанных с обоими экземплярами паруса, или это должно быть действительно Приятно знать, может ли экземпляр знать, подключен ли конкретный клиент.

Спасибо!

Что я делаю, так это подписываю сокет на свою комнату (обычно это номер пользователя). Таким образом, вам не нужно отслеживать идентификатор сокета (который изменяется для каждого подключения браузера). Когда какой-либо части моего приложения необходимо "поговорить" с подключением, оно отправляет сообщение в комнату. Это хорошо, потому что позволяет пользователю с нескольких устройств получать одно и то же сообщение (так же, как когда у вас есть Skype на рабочем столе и на телефоне, и вы можете общаться в чате, используя любое из них взаимозаменяемо).

Итак, пользователь А соединяется с рабочим столом, я подписываю его / ее сокет 1235 на его / ее комнату UserA. Если пользователь А подключается одновременно с телефоном, я подписываю сокет 4567 на комнату UserA. Если любому работнику необходимо отправить сообщение, оно отправляется в комнату UserA. Вы можете использовать socket.io-emitter: https://github.com/socketio/socket.io-emitter

var io = require('socket.io-emitter')({ "host" : REDIS_WEBSOCKET_HOST, "port" : REDIS_WEBSOCKET_PORT });

io.in("userA").emit("message", "Some message");

РЕДАКТИРОВАТЬ

Кроме того, помните, что у Паруса есть broadcast особенность:

http://sailsjs.org/documentation/reference/web-sockets/sails-sockets/sails-sockets-broadcast

Вы можете отправить сообщение в комнату. Если ваше сообщение является глобальным, вы можете подписать все сокеты на глобальную комнату, и любой экземпляр Sails сможет общаться со всеми. Если вы все еще хотите отслеживать отдельные розетки, вы можете использовать мою технику выше и использовать паруса broadcast в эту комнату вместо socket.io-emitter,

Другие вопросы по тегам