2016-09-19 4 views
1

내 프로젝트는 외부 API와 통신하기 위해 프록시 서버로 Nodejs로 작성됩니다.Node.js 및 서버 보낸 이벤트에 Redis 사용 방법 이해

API는 Redis (pub/sub)를 통해 제품 업데이트를 전송합니다. 프록시 서버는 메시지를 처리하여 SSE (Server Sent Events)를 통해 클라이언트에 보냅니다.

Redis와 SSE를 사용하는 저로서는 처음으로 튜토리얼을 온라인에서 찾는 것이 구현하기 쉽고 실제로했습니다.

// Client Side 
var source = new EventSource('/redis'); // /redis is path to proxy server 
source.addEventListener('items', handleItemsCallback, false); 
source.addEventListener('users', handleUsersCallback, false); 
source.addEventListener('customers', handleCustomersCallback, false); 

// Function sample... 
function handleItemsCallback (msg) { 
    // Do something with msg... 
} 

프록시 서버에서 내가 레디 스 메시지를 처리 ​​할 수 ​​/redis 라우팅과 컨트롤러를 만든 : 클라이언트 측에서

난 그냥 내가 그것으로 무언가를 최대한 빨리 업데이트를받을 같은 EventSource 및 생성 :

exports.redisUpdates = function (req, res) { 
    // Redis Authentication 
    var redisURL = url.parse(process.env.REDISCLOUD_URL); 
    var client = redis.createClient(redisURL.port, redisURL.hostname, {ignore_subscribe_messages: false}); 
    client.auth(redisURL.auth.split(":")[1]); 

    // let request last as long as possible 
    req.socket.setTimeout(0); 

    // Subscribe to channels 
    client.subscribe('items', 'users', 'customers'); 

    // Handle messages 
    client.on('message', function (channel, message) { 
     res.write('retry: 5000\n'); 
     res.write('event: ' + channel + '\n'); 
     res.write('data: ' + message + '\n\n'); 
     res.flush(); // If I do not add this it doesn't push updates to the client (?) 
    }); 

    //send headers for event-stream connection 
    res.writeHead(200, { 
     'Content-Type': 'text/event-stream', 
     'Cache-Control': 'no-cache', 
     'Connection': 'keep-alive' 
    }); 
    res.write('\n'); 

}; 

은 여러 가지 오류가 발생할 잘 작동 개발 환경에서 로컬로 사용하지만, 생산에서 사용, 앱은 Heroku가 에서 호스팅되는및 Heroku 메트릭 여러 개 표시 H18, H12, H27 오류;

간혹 /redis 전화가 돌아 오는 상태 인 503;

내가 왜 모든 자습서 res.flush()을 언급하지 않고 내가 처음 일을 수 있도록 자신에 의해 그것을 발견, 제대로 이러한 서비스를 사용하고 있다면 내가 이해하고자하는 것은 ... 모든 공정에서

답변

1

, 이 질문은 몇 가지 이유로 정말로 답할 수 없습니다. 나는 당신이 질문에서 어떤 언급도하지 않았기 때문에 당신이 이야기하고있는 튜토리얼을 모른다. 참조되지 않은 자습서를 작성한 사람들을 대신해서 말할 수는 없습니다. 그들은 단지 잘못되었을 수도 있고, 성취하고자하는 것에 대한 아키텍처가 약간의 차이가있을 수도 있습니다. 나는 또한 당신이 당신의 프로젝트에서 어떤 프레임 워크 또는 옵션 미들웨어를 사용하고 있는지 모른다.

이제 모든 내용을 공유 할 수있는 몇 가지 사실이 나와 있습니다.

아마도 대부분의 튜토리얼은 연결을 열고 스트림에서 무기한 읽지 않을 것입니다. 프로세스가 끝나면 http 응답은 .end() 또는 비슷한 것으로 닫힙니다. HTTP 응답은 쓰기 스트림이므로 다른 모든 스트림과 동일한 규칙을 따릅니다. 현재 스트림에 대한 좋은 정보를 많이 찾을 수 있습니다 이해하는 것이 중요합니다

https://github.com/substack/stream-handbook

뭔가가 스트림 버퍼를 가질 수 있고 대부분의 HTTP 프레임 워크를 사용하는 버퍼의 원인 압축을 사용한다는 것입니다. 당신은 출력이 하나, 당신이 업데이트되고 계속 원하기 때문에 다음 링크의 코드 예제는 프레임 워크는 무대 뒤에서 당신을 위해 어떻게 할 것인지의 좋은 예 (물론 최소한의 구현)

https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#what-we-ve-got-so-far

입니다 출력 버퍼 크기에 도달하거나 .flush()를 호출해야 할 때까지 기다려야합니다.

익스프레스를 사용하는 경우 압축 미들웨어와 관련된 다음 스택 오버플로 게시를 확인하십시오. /redis 경로를 사용 중지해야합니다.

Node Express Content-Length

는 그게 조금 도움이되기를 바랍니다. 내가 말했듯이,이 질문에 대답하기는 어렵다. ;)