Как 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
,