マイプロジェクトは、外部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のメトリックショー、H12、H27エラー;
時々/redis
コールリターンステータス503
;
私は何を理解したいことは、私が正しくこれらのサービスを使用している場合は、なぜすべてのチュートリアルがres.flush()
を言及していないと私はそれが最初の時間を作業できるように自分でそれを発見している...すべて公平で