2012-01-31 3 views
2

Я используюScaling Socket.IO и трансляции всех принадлежащих клиентам

Экспресс с "Connect-Redis" сессия магазин

И I tied it with Socket.IO through configuring "authorization"

Так что я не должны фактически использовать

socket.get 

or

socket.set 

Хранить и извлекать принадлежащие клиенту переменные.

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

Так что это действительно масштабируется!

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

Также I tried to use

RedisStore

который дается Socket.io

не работает.

Это говорит

DEBUG: TypeError: Converting circular structure to JSON 
    at Redis.stringify [as pack] (native) 
    at Redis.publish (/var/www/node_modules/socket.io/lib/stores/redis.js:106:31) 
    at Manager.handleClient (/var/www/node_modules/socket.io/lib/manager.js:646:18) 
    at Manager.handleHTTPRequest (/var/www/node_modules/socket.io/lib/manager.js:595:8) 
    at Manager.handleRequest (/var/www/node_modules/socket.io/lib/manager.js:557:12) 
    at HTTPServer.<anonymous> (/var/www/node_modules/socket.io/lib/manager.js:112:10) 
    at HTTPServer.emit (events.js:70:17) 
    at HTTPParser.onIncoming (http.js:1507:12) 
    at HTTPParser.onHeadersComplete (http.js:102:31) 
    at Socket.ondata (http.js:1403:22) 

Как можно масштабировать Socket.IO с вещанием для всех масштабируемых клиентов доступен?

Edit: Я последовал the Express-Session-Socket.IO tutorial и я обнаружил, что io.authorization фактически делает проблему, но это нормально без io.authorization. Как это?

+0

Не могли бы вы уточнить, какие группы пользователей вы хотите транслировать? Например, будут ли они пользователями в том же канале (socket.join()) или пользователями, которые подключены к одному и тому же URL (например,/chat/1 или/chat/2)? – mtsr

+0

@mtsr все пользователи в тех же пространствах имен или в одном и том же канале, но на другом сервере (масштабируются) – InspiredJW

+0

Пространство имен может быть выполнено путем простой маршрутизации этих пользователей на один и тот же сервер. С каналами, которые будут сложнее, потому что каналы соединяются после установления соединения. – mtsr

ответ

2

У Socket.IO есть свое разрешение. Он разрешает для каждого сокета. Для того, чтобы настроить Socket.io Auth, используя мой код, написать внутри функций io.configure:

io.set('authorization', function (handshakeData, callback) { 
     //your auth logic 
}); 

С моим примером RedisStore масштабирования для всех bradcasting клиентов доступны.

+0

Когда авторизация прошла успешно, я должен вызвать ** callback (null, true); ** Но эта функция обратного вызова фактически вызывает проблему :( – InspiredJW

+0

Без функции обратного вызова RedisStore хорошо работает. Некоторые люди говорят, что у него проблемы с утечкой памяти.Это правда? Также я обнаружил, что мне нужно использовать ** Redis.get() и Redis.set() ** Вместо использования ** Socket.get() и Socket .set() ** для хранения значений. Надеюсь, я смогу динамически объединиться и покинуть комнаты. Не отключая мое соединение, чтобы сразу оставить все комнаты. – InspiredJW

+0

@InspiredJW Когда я вызываю обратный вызов (null, true), я не получаю Ошибка. О утечке на данный момент у меня их нет. В моем коде вы увидите, что я использую client.broadcast.to (Room) .json.send, внутренне Scoket.io Сделайте набор для Redis. Я не знаю что вы просите, но я почти уверен, что вы можете вызвать и отключить. Читайте wiki: https: // gith ub.com/LearnBoost/socket.io – elranu

Смежные вопросы