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

Масштабирование Engine.IO с магазином Redis (vs. Socket.IO)

Есть несколько вопросов по этой теме, но никто не может решить эту проблему.

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

Вопросы вроде этого имеют противоречивые ответы:

Итак, как я его вижу:

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

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

Затем я вижу, что Socket.IO может быть оставлен и компании высокого профиля перемещаются в Primus.

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

4b9b3361

Ответ 1

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

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

Мой хост был прав, чтобы сказать мне использовать Engine.IO(или что-то еще). Socket.IO имеет огромное количество серьезных проблем, худшим из которых является то, что он неожиданно DDoS ваш сервер. Я испытал эту первую руку с относительно небольшим количеством клиентов и полностью отключил мой сервер, пока не смог переписать 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:

Ends up Engine.IO также попадает в петли повторного соединения (несколько секунд), поэтому я в конечном счете использовал SockJS. Это дало мне лучшую связь и стабильность, и Primus теперь обрабатывает повторное соединение (которое SockJS не делает).

Ответ 2

Я согласен с тем, что 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

Ответ 3

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