Подтвердить что ты не робот

Реализация Pub/sub в nodeJS

Я играл с различными реализациями публикации/подписки для nodeJS и задавался вопросом, какой из них лучше всего подходит для конкретного приложения. Требования приложения включают синхронизацию объектов в реальном времени в многоканальных многопользовательских 3D-средах.

Я начал использовать socket.io, создал базовый массив каналов, и когда пользователи отправляют сообщения, он перебирает пользователей в этом канале и отправляет сообщение клиенту пользователя. Это сработало хорошо, и у меня не было никаких проблем с этим.

Для сохранения объектов я добавил поддержку Redis с помощью node_redis. Затем я заменил цикл client.send на массив каналов с помощью Redis pub/sub как слой абстракции. Но я заметил, что мне нужно создать новый клиент Redis для каждого пользователя, который сделал подписку. И мне все еще нужно было хранить информацию о клиенте socket.io для отправки сообщений на публикацию. Насколько это масштабируемо? Есть ли другие (лучшие) реализации или дальнейшие оптимизации, которые я мог бы сделать? Что бы вы сделали?

4b9b3361

Ответ 1

Для сохранения объекта я добавил Redis поддержка с помощью node_redis. Затем я заменил цикл client.send на массив каналов с Redis pub/sub как слой абстракции. Но я заметил, что мне нужно создать новую Клиент Redis для каждого пользователя, который сделал подписка. И мне все еще нужно было хранить информацию о клиенте socket.io для отправлять сообщения на публикацию. Как это масштабируемый? Есть ли другие (лучше) или дальше оптимизация, которую я мог бы сделать? Что бы вы делаете?

Да, вам нужно создать новый клиент redis для каждого запроса io. Он тяжелый и не масштабируемый. Но создание нового клиентского соединения redis не потребляет много памяти. Поэтому, если ваш системный пользовательский счет не превышает 5000, тогда все в порядке. Для масштабирования вы можете добавить сервер slav redis для разрешения тяжелой публикации и подписки, а если вас беспокоит создание большого количества подключений, вы можете увеличить свою ОС uLIMIT.

Вам не нужно хранить клиент socket.io в отправленном сообщении. После того, как redis получил подписанное сообщение канала. Он отправит сообщение конкретному клиенту io.

subscribe.on("message",function(channel,message) { 
 var msg = { message: [client.sessionId, message] }; 
 buffer.push(msg);
 if (buffer.length 15) buffer.shift(); 
 client.send(msg); > });

Чтобы подписаться на многоканальный. Я предлагаю вам предварительно хранить всех пользователей с несколькими каналами (вы можете использовать хранилище Mongodb или redis).

var store = redis.createClient();
var subscriber= redis.createClient()

store.hgetall(UID, function(e, obj){
     subscriber.subscribe(obj.ChannelArray.toArray());
 })

Ответ 2

Я использую Faye.js. Серьезно простейшая паб/суб-реализация, которую я мог найти. Может быть, это поможет!

Ответ 3

Попробуйте найти этот вопрос относительно redis pub/sub и socket.io.

Ответ 4

Или вы можете попробовать juggernaut. Он использует socket.io + redis pub sub middleware + node.js. Поддержите все транспорты. Это поможет вам обработать все каналы для подписки или публикации между клиентом и redis. Juggernaut является масштабируемым, но только забота о накладных расходах на redis и не поддерживает аутентификацию (вы можете сделать какой-то трюк). Однако redis может писать/читать > 150 к в секунду, поэтому для вашего случая не должно быть проблем.

https://github.com/maccman/juggernaut

Ответ 5

FYI Socket.io v0.7 будет поддерживать каналы и должен упростить существующий код (не более зависимостей pub/sub lib)

Смотрите: http://cl.ly/0B0C3f133K1m3j422n0K