Проект чата - баланс нагрузки с socket.io

Я участвую в проекте по разработке чата, в котором мы используем node.js, socket.io (комнаты) и mongodb. Мы находимся на этапе тестирования производительности и очень обеспокоены, нуждается ли система в балансировке нагрузки.

Как мы можем развиваться, если наш проект нуждается в этом? J'a, исследующий NGINX, выглядит круто, но мы сомневаемся, решит ли наша проблема, как то, как система будет вести чат, мы боимся, что серверы не ~ правильно общаются друг с другом...

Куда мы пойдем, если нам нужна балансировка нагрузки?

2 ответа

Решение

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

То, что это делает, создает паб / подсистему между вашими серверами, чтобы отслеживать ваши различные клиенты сокетов.

var io = require('socket.io')(3000),
    redis = require('redis'),
    redisAdapter = require('socket.io-redis'),
    port = 6379,
    host = '127.0.0.1',
    pub = redis.createClient(port, host),
    sub = redis.createClient(port, host, {detect_buffers: true}),
    server = http(),
    socketServer = io(server, {adapter: redisAdapter({pubClient: pub, subClient: sub})});

читайте больше здесь: socket.io-redis

Что касается обработки разных серверов узлов, существуют разные подходы.

  • AWS ELB (эластичный балансировщик нагрузки)
  • Nginx
  • апаш
  • HAProxy

Среди других...

Проверьте пакет NPM mong.socket.io. Он имеет возможность сохранять данные socket.io в mongoDB, как показано ниже;

{
    "_id" : ObjectId("54b901332e2f73f5594c6267"),
    "event" : "join",
    "message" : {
            "name" : "join",
            "nodeId" : 426506139219,
            "args" : "[\"URAiA6mO6VbCwquWKH0U\",\"/54b6821asdf66asdasd2f0f9cd2997413780273376\"]"
    }}

Или вы можете использовать адаптер Redis, как упомянуто там;

Socket.IO Использование нескольких узлов

Затем просто используйте обратный прокси-сервер NGINX, и все процессы узла должны делиться событиями Socket.IO друг с другом.

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