我有一个node.js服务器 A ,mongodb用于数据库。 还有另一个远程服务器 B (不需要基于节点),它暴露了HTTP / GET API' / status'并返回' FREE'或者'忙碌'作为回应。
当用户点击服务器 A 中的特定API端点(比如POST / test)时,我希望每次都开始轮询服务器 B 的状态API分钟,直到服务器 B 返回'免费'作为回应。用户不需要等到服务器 B 返回' FREE'响应(轮询B是服务器A中的后台作业)。一旦服务器 A 获得免费'来自 B 的回复,它将向用户发送电子邮件。
如何在服务器 A 中实现这一点,请记住并发用户数量会变大?
答案 0 :(得分:1)
从node.js文档中的示例开始,我会使用类似代码的内容。我测试过它的确有效。顺便说一句,我在这里假设api响应类似于{"status":"BUSY"}
& {"status":"FREE"}
const http = require('http');
const poll = {
pollB: function() {
http.get('http://serverB/status', (res) => {
const { statusCode } = res;
let error;
if (statusCode !== 200) {
error = new Error(`Request Failed.\n` +
`Status Code: ${statusCode}`);
}
if (error) {
console.error(error.message);
res.resume();
} else {
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; });
res.on('end', () => {
try {
const parsedData = JSON.parse(rawData);
// The important logic comes here
if (parsedData.status === 'BUSY') {
setTimeout(poll.pollB, 10000); // request again in 10 secs
} else {
// Call the background process you need to
}
} catch (e) {
console.error(e.message);
}
});
}
}).on('error', (e) => {
console.error(`Got error: ${e.message}`);
});
}
}
poll.pollB();
您可能想要使用此脚本并为您删除不必要的代码,但这是作业;)
<强>更新强>
为了在node.js中处理大量并发,我建议实现集群或使用框架。以下是一些开始研究该主题的链接:
How to fully utilise server capacity for Node.js Web Apps
How to Create a Node.js Cluster for Speeding Up Your Apps
答案 1 :(得分:0)
我建议您使用议程。 https://www.npmjs.com/package/agenda 通过议程,您可以创建定期计划,您可以在其中安排任何非常灵活的计划。
我建议你使用请求模块来发出HTTP get / post请求。 https://www.npmjs.com/package/request
答案 2 :(得分:0)
使用像request,superagent或restify-clients这样的库来调用服务器B.我建议你避免轮询,而是在调用B时使用webhook(假设你也在创作B)。如果您无法更改B,则可以使用setTimeout以1秒的间隔安排后续呼叫。