2013-08-07 4 views
13

Есть несколько вопросов по этой теме, но никто не может решить эту проблему.Масштабирование Engine.IO с магазином Redis (vs. Socket.IO)

Я использую Socket.IO с магазином redis, и я готовлюсь к обрыву трафика. Моя хостинговая компания сказала: «Вам нужно использовать Engine.IO вместо Socket.IO, потому что это намного эффективнее», поэтому я пытаюсь понять, что это значит.

Questions like this имеют, казалось бы, противоречивые ответы:

Так как я вижу это:

  • Socket.IO 0,9 деградирует
  • Engine.IO повышает
  • Socket.io 1.0 будет использовать Engine.IO
  • Если вы хотите запустить Engine.IO на нескольких экземплярах, вы должны написать Redis хранить себя

Но тогда Engine.IO говорит, что это «балансировка нагрузки», но ничего не говорит о redis. У него должен быть какой-то внешний магазин, верно? Но если у него несколько транспортов и магазин, в чем смысл Socket.IO?

Затем я вижу, что Socket.IO might be abandoned и high profile companies are moving - Primus.

Как мне сделать масштабирование Engine.IO? Должен ли я сам писать в магазине?

+0

Если вы идете с Engine.IO, да вам придется написать свой собственный магазин. Я знаю, что нехорошо жаловаться на отсутствие обновлений в проектах с открытым исходным кодом, но я чувствую, что они сбросили мяч на Socket.IO. Есть много вопросов, плавающих вокруг, как это, и 1.0 был не за горами уже более полугода. Есть сотни открытых проблем, которые много месяцев назад на socket.io, поэтому он все время выглядит невосприимчивым к этому вопросу. –

+0

Если вы хотите использовать engine.io, тогда да, вам нужно будет написать дополнительный материал. Я бы предположил, что socket.io сталкивается с некоторыми блокпостами, адаптирующимися к новому ядру. Socket.io - для engine.io, что выразить для подключения. Он скрывает низкоуровневые детали engine.io и является гибким и удобным для пользователя. Но я бы попросил вас не строить магазин поверх него по той же причине. socket.io 1.0 строился на основе обещания engine.io. Учитывая статус socket.io 1.0, любой может гарантировать, что engine.io будет успешным. Если 1.0 находится в очереди, подождите, потому что это будет лучше, чем вы можете сделать, если это произойдет. – user568109

ответ

-1

Ну, как вы уже упоминали, я должен взглянуть на Примус. Масштабирование осуществляется с использованием HAProxy. В качестве основного сообщения вы все равно можете использовать Socket.io, но также engine.io. Используя Primus, вы можете экспериментировать с разными библиотеками. Есть интересная статья о масштабировании Redis на http://pusher.com/docs/server_libraries.

+0

Имейте в виду, что он рекомендует HAProxy для своих липких сеансов, что означает, что он всегда должен перенаправлять кого-то с тем же сеансом на тот же компьютер. Это делает это вместо общего хранилища информации о соединении. Для каждого подхода есть несколько плюсов и минусов, поэтому убедитесь, что вы их понимаете, прежде чем прыгать. http://stackoverflow.com/questions/1553645/pros-and-cons-of-sticky-session-session-affinity-load-blancing-strategy –

+0

Я не решал. Я просто пытался помочь и указать OP на некоторые статьи, которые кто-то написал. Спасибо за понижение. –

+0

Я знаю. Это предназначалось для ОП. –

10

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

1) Никогда не используйте Socket.io (от 0.9.16)

Мой хозяин был прав, чтобы сказать мне, чтобы использовать Engine.IO (или что-нибудь еще). Socket.IO имеет огромное количество серьезных проблем, худшим из которых является то, что он неожиданно появится DDoS your server. Я испытал эту первую руку с относительно небольшим количеством клиентов и полностью отключил мой сервер, пока не смог переписать Socket.IO. Я добрался до 25 + дронов, чтобы поглотить удар, и это не имело значения. Один клиент может отправлять 1000 запросов в секунду.

2) Другие двигатели не должны Redis магазины

Socket.IO позволяет вам передач через узлы, понижая в их магазине Redis. Насколько я могу судить, Engine.IO, Primus и SockJS этого не предлагают.Поэтому, когда эти двигатели требуют «балансировки нагрузки», это не означает, что вы можете транслировать через узлы. Я начинаю думать, что на самом деле это хорошо. Написание pub/sub с redis относительно легко, и его выделение было приятным.

В итоге я использовал Primus с Engine.IO, а затем использовал redis pub/sub для обмена событиями между узлами. Мне потребовалось около 5 часов, чтобы удалить Socket.IO, подключить Primus, написать паб/sub и пойти вживую. До сих пор это был гораздо лучший опыт.

UPDATE:

Заканчивается Engine.IO также получает в переподключениях петель (несколько в секунду), так что я в конечном счете используется SockJS. Это дало мне лучшую связь & стабильность, и Primus now handles the reconnect (что SockJS не делает).

+0

Эй, теперь, когда вы переключились с двигателя на sockjs, redis pub/sub все еще работает так же? Вы все еще можете масштабироваться с помощью redis? – Harry

+1

Чтобы быть понятным, паба/подставка Redis не встроена в engineio или sockjs. Я подключил redis полностью независимо. Поскольку я использую Primus, переключение не изменило часть redis вообще. – bendytree

+0

Почему бы не использовать Primus + Redis pub/sub и добавить слой SockJs? – hfcorriez

1

Я согласен с тем, что Socket.IO следует избегать до тех пор, пока не будет выпущен v1.0, это глючит, и в моих тестах Engine.IO работал лучше (https://medium.com/node-js-javascript/b63bfca0539). Primus, безусловно, тоже хороший вариант: возможно, вы будете использовать Engine.IO сейчас, но когда выйдет Socket.IO 1.0, вы захотите переключиться на него.

Я реализовал аналогичную программу с конструкцией Engine.IO и Redis и Pub/Sub, она выглядит очень элегантно. Приведенный ниже код подписывает подключенный клиент к номеру/каналу.

io.on('connection', function (socket) { 
    var observerRedisClient = redis.createClient(); 
    observerRedisClient.subscribe(resourceId, redis.print); 

    observerRedisClient.on('message', function(channel, message) { 
     socket.send(message); 
    }); 
}); 

И если вы обновите этот канал, т.е. сохраните некоторые данные и опубликуйте их, тогда все подписанные клиенты получат его.

redisClient.set(key, value, redis.print); 
redisClient.publish(key, value); 

Если вы заинтересованы код с открытым исходным кодом: https://github.com/denizozger/node-engine.io-server

Смежные вопросы