2016-09-19 16 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のメッセージを処理するために/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のでホストされていますとH18いくつかのHerokuのメトリックショー、H12H27エラー;

時々/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()を呼び出さなければならないまで待たなければなりません。

Expressを使用している場合は、圧縮ミドルウェアに関する次のスタックオーバーフローポストを参照してください。あなたの/redisルートでは無効にする必要があると思います。

Node Express Content-Length

私は少しを助けたことを願っています。私が言ったように、この種の質問に答えるのは難しい。 ;)

関連する問題