Чат проект - баланс нагрузки с socket.io
Я участвую в проекте разработки чата, где мы используем node.js, socket.io(комнаты) и mongodb. Мы находимся на этапе тестирования производительности, и мы очень обеспокоены тем, что система нуждается в балансе нагрузки.
Как мы можем развиваться, если наш проект нуждается в этом? J'a, изученный на NGINX, выглядит круто, но мы сомневаемся, решает ли наша проблема, как система будет чатом, мы боимся, что серверы не говорят друг с другом правильно...
Куда мы идем, если нам нужна балансировка нагрузки?
Ответы
Ответ 1
Чтобы обеспечить масштабирование до нескольких узлов, но поддерживаем межсоединение между разными клиентами и разными серверами, я использую redis. Это на самом деле очень простое в использовании и настройке.
Что это значит, создается система pub/sub между серверами, чтобы отслеживать ваши разные клиенты сокетов.
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
Что касается обработки различных серверов node, существуют разные подходы.
- AWS ELB (балансировщик упругой нагрузки)
- Nginx
- Apache
- HAProxy
Среди других...
Ответ 2
Посмотрите пакет NPM mong.socket.io. Он имеет возможность сохранять данные socket.io в mongoDB, как показано ниже;
{
"_id" : ObjectId("54b901332e2f73f5594c6267"),
"event" : "join",
"message" : {
"name" : "join",
"nodeId" : 426506139219,
"args" : "[\"URAiA6mO6VbCwquWKH0U\",\"/54b6821asdf66asdasd2f0f9cd2997413780273376\"]"
}}
Или вы можете использовать адаптер redis, как указано там;
Socket.IO Использование нескольких узлов
Затем просто используйте обратный прокси NGINX, и все процессы node должны делиться событиями Socket.IO друг с другом.