Проект чата - баланс нагрузки с 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 друг с другом.