【发布时间】:2017-01-26 21:14:38
【问题描述】:
我的项目是使用 Nodejs 作为代理服务器构建的,用于与外部 API 进行通信。
API 通过 Redis (pub/sub) 发送产品更新;代理服务器处理消息并通过 SSE(服务器发送事件)将其发送给客户端。
这是我第一次使用 Redis 和 SSE 并且在网上寻找教程似乎很容易实现,我做到了。
在客户端,我刚刚创建了一个EventSource,一旦收到更新,我就会对其进行处理:
// 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 消息:
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 Metrics 显示几个 H18、H12、H27 错误;
有时/redis调用返回状态503;
我想了解的是,如果我正确使用了这些服务,为什么所有教程都没有提到res.flush() 而我自己发现它是为了让它第一次工作......
【问题讨论】:
标签: javascript node.js heroku redis server-sent-events