Как синхронизировать доступ к глобальным переменным в Node.Js. Является ли nodejs правильным выбором для разработки приложений для чатов?

Способен ли NodeJS поддерживать приложение с несколькими чатами, где клиенты подписываются на чат через HttpLongPolling и WebSocket? Когда я думаю о решении для чата, я вижу необходимость в блоках синхронизации при широковещании для длинных запросов на опрос и соединениях через сокеты, когда сообщения получены в diff. частоты. Насколько я знаю, в JS нет концепции многопоточности и блоков синхронизации, но все же для доступа к глобальным переменным в JS нам нужны блоки синхронизации. Моя задача заключается не в том, чтобы разработать решение для чата, а в том, что оно похоже на него, т.е. своевременная рассылка сообщений разным пользователям, подписанным на каналы. Является ли NodeJs правильным выбором для этого?

Я проанализировал CometD, и это кажется правильным выбором для этого решения, когда оно поставляется с решением, встроенным в систему с концепцией канала. Но у CometD есть проблема с масштабируемостью, поэтому я пробую nodejs, который кажется легким, но мне нужно разработать это решение на NodeJs. Мне не нужно обрабатывать сообщение, а просто передать его клиентам браузера.

Любое предложение ?


person Vimal Niroshan    schedule 22.12.2012    source источник
comment
возможно, github.com/learnboost/socket.io — это то, что вы ищете, есть также библиотеки, которые построены поверх него   -  person Yury Solovyov    schedule 22.12.2012
comment
CometD имеет проблемы с масштабируемостью? Вероятно, вы пропустили этот тест: webtide.intalio.com /2011/09/cometd-2-4-0-websocket-benchmarks. Мне будет интересно узнать, превышают ли ваши цифры те, которые показывает CometD.   -  person sbordet    schedule 22.12.2012
comment
Да, мое мнение о CometD основано на том же тесте. Я доволен тестами веб-сокетов CometD, но httpLongPolling кажется проблемой, так как мы ожидаем больше пользователей на httpLongPoll. Решение для поддержки 1,5 миллионов CCU, сочетающих httpLongPolling и WebSocket Таким образом, кривая пользователей CometD 50K кажется довольно плохой, поскольку задержка увеличивается в геометрической прогрессии. Для распределения нагрузки на несколько экземпляров требуется около 30 экземпляров с 50 000 пользователей на экземпляр.   -  person Vimal Niroshan    schedule 03.01.2013
comment
Спасибо, я обнаружил, что socket.io пытается это сделать сейчас.   -  person Vimal Niroshan    schedule 03.01.2013


Ответы (1)


Я сделал несколько многопользовательских/многокомнатных приложений, используя статические файлы, лонгполлинг (comet), сокеты, веб-сокеты на нескольких языках (c, PHP, node), и на сегодняшний день лучший опыт — это NodeJS + Socket.IO.

Это так просто ... потому что Socket.IO адаптируется к доступным ограничениям клиента, используя от лонгполлинга до веб-сокетов или флэш-сокетов в зависимости от него. Тем не менее, чем меньше вы полагаетесь на лонгполлинг, тем лучше.

Вы создаете сервер Socket.IO, настраиваете его и 2 события для входа и выхода из комнаты (помимо остальных событий, которыми вы хотите управлять). Быстрый скелет приложения будет следующим. Вам нужно контролировать списки пользователей, имена пользователей и т. д., но это можно легко сделать, индексируя данные пользователя по socket.id и управляя этим хэшем с помощью событий подключения/отключения. «fn» — это функции обратного вызова клиента.

var http      = require('http')
  , ioo       = require('socket.io')
  ;

var app = http.createServer();
var io  = ioo.listen(app);

// ... Place here Socket.IO configuration...

var port = 8080;
app.listen( port, function() { console.log( 'Server started' ); } );

io.sockets.on( 'connection', function( socket ) {
    // Management messages
    socket.on( 'connect', function( name, fn ) { connect( socket, name, fn ); });
    socket.on( 'disconnect', function() { disconnect( socket.id ); });

    socket.on( 'joinRoom', function( roomName, fn ) { joinRoom( socket, roomName, fn ); });
    socket.on( 'leaveRoom', function( roomName, fn ) { leaveRoom( socket, roomName, fn ); });
} );


...


function joinRoom( socket, roomName, fn ) {
    socket.join( roomName );
    socket.broadcast.to( roomName ).emit( 'serverMessage', 'a user enters' );
    socket.emit( 'message', 'You enter in room ' + roomName );
}

function leaveRoom( socket, roomName, fn ) {
    socket.leave( roomName );
    socket.broadcast.to( roomName ).emit( 'serverMessage', 'a user leaves' );
    socket.emit( 'message', 'You leave room ' + roomName );
}

Полное описание функций комнат Socket.IO см. на сайте Socket.IO.

person JR.    schedule 28.01.2013