2012-06-16 4 views
2

나는 Reddy와 함께 Node.js와 Socket.io를 사용하여 Heroku에 앱을 배포하려고합니다. 나는 XHR 긴 폴링을 specified by Heroku으로 사용하도록 Socket.io를 설정했으며, 하나의 dyno 만 있으면 완벽하게 작동하지만 다중 dynos를 사용하도록 크기를 조절할 때는 작동하지 않습니다. 내가 사용하여 최대 크기를 조절할 때Node.js와 함께 Heroku에서 Socket.io와 Redis 사용하기

처음에 나는 Socket.io에 MemoryStore를 사용했고, "Heroku가 추신 : 규모의 웹 = 2"가 간헐적으로 작동하고, 클라이언트에서이 오류를주고 시작 :

Uncaught TypeError: Property 'open' of object #<Transport> is not a function

는 나는 그래서

"여러 과정 및/또는 여러 서버 당신이 중간에 사람으로 레디 스 형 NoSQL 데이터베이스를 사용하여 우리의 RedisStore을 사용할 수 있습니다로 확장하려는 경우", 내가 만든 Socket.io documentation하는 발견 RedisStore :

617,451,515,및 구성 Socket.io는이 기능을 사용하려면

//set up Web Socket Server 
io.configure(function() { 
    io.set("transports", ["xhr-polling"]); 
    io.set("polling duration", 10); 
    io.set('store', newRedisStore); 
}); 

그리고 모든 로컬 및 Heroku가 하나의 웹 다이노와 함께 완벽하게 작동합니다. 그러나 하나 이상의 프로세스로 확장하자마자 간헐적으로 다시 작업하지 않습니다. 이제는 오류가 발생하지 않습니다. 그래서 여기서 어디로 가야할 지 모르겠습니다.

이 내가이 개 프로세스와 Heroku가에서 받고 있어요 로그는 다음과 같습니다

2012-06-16T15:36:12+00:00 app[web.2]: debug: setting poll timeout
2012-06-16T15:36:12+00:00 app[web.2]: debug: clearing poll timeout
2012-06-16T15:36:12+00:00 app[web.2]: debug: xhr-polling writing
7:::1+0 2012-06-16T15:36:12+00:00 app[web.2]: warn: client not
handshaken client should reconnect 2012-06-16T15:36:12+00:00
app[web.2]: debug: set close timeout for client 15718037491002932534
2012-06-16T15:36:12+00:00 app[web.2]: debug: cleared close timeout for
client 15718037491002932534 2012-06-16T15:36:12+00:00 app[web.2]:
info: transport end (error) 2012-06-16T15:36:12+00:00 app[web.2]:
debug: discarding transport

답변

1

당신은 노드에서 클러스터 모듈을 사용하려고 했습니까? http://nodejs.org/api/cluster.html

처럼 :

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    } 

    cluster.on('death', function(worker) { 
    console.log('worker ' + worker.pid + ' died'); 
    }); 
} else { 
    // Worker processes have a http server. 
    http.Server(function(req, res) { 
    res.writeHead(200); 
    res.end("hello world\n"); 
    }).listen(8000); 
} 

또는 :

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    } 
} else { 
    var sio = require('socket.io') 
    , RedisStore = sio.RedisStore 
    , io = sio.listen(8080, options); 

    // Somehow pass this information to the workers 
    io.set('store', new RedisStore); 

    // Do the work here 
    io.sockets.on('connection', function (socket) { 
    socket.on('chat', function (data) { 
     socket.broadcast.emit('chat', data); 
    }) 
    }); 
} 

당신이 here을 볼 수있다.

+0

감사합니다. 그게 올바른 방향으로 움직이는 것 같지만 작동시키지 못합니다. Socket.io는 클러스터를 사용할 때 방출시 오류를 계속 발생시킵니다. – tomgersic

+0

[timeout] (https://devcenter.heroku.com/articles/request-timeout#longpolling_and_streaming_responses)을 늘려보고 알려주세요. 또한 코드를 게시 할 수 있으므로 pastebin.com 또는 그 종류를 사용하여 분석 할 수 있습니다. –

관련 문제