如何从 node.js 服务器定期轮询另一台服务器?
How to poll another server periodically from a node.js server?
我有一个 node.js 服务器 A,数据库 mongodb。
还有另一个远程服务器 B(不需要基于节点)它公开了 HTTP/GET API '/status' 和 returns 'FREE' 或 'BUSY' 作为响应。
当用户点击服务器 A 中的特定 API 端点时(比如 POST /test),我希望启动轮询服务器 B的状态每分钟API,直到服务器Breturns'FREE'作为响应。用户不需要等到服务器 B returns 'FREE' 响应(轮询 B 是服务器 A 中的后台作业)。一旦服务器 A 收到来自 B 的 'FREE' 响应,它就会向用户发送一封电子邮件。
如何在服务器 A 中实现这一点,请记住并发用户数可能会变大?
我建议你使用议程。 https://www.npmjs.com/package/agenda
使用议程,您可以创建重复的时间表,您可以在其中安排任何非常灵活的事情。
我建议您使用请求模块来发出 HTTP get/post 请求。
https://www.npmjs.com/package/request
根据 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 Create a Node.js Cluster for Speeding Up Your Apps
使用 request、superagent 或 restify-clients 等库来调用服务器 B。我建议您避免轮询,而是在调用 B 时使用 webhook(假设您也在编写 B)。如果您不能更改 B,则可以使用 setTimeout 以 1 秒为间隔安排后续调用。
我有一个 node.js 服务器 A,数据库 mongodb。 还有另一个远程服务器 B(不需要基于节点)它公开了 HTTP/GET API '/status' 和 returns 'FREE' 或 'BUSY' 作为响应。
当用户点击服务器 A 中的特定 API 端点时(比如 POST /test),我希望启动轮询服务器 B的状态每分钟API,直到服务器Breturns'FREE'作为响应。用户不需要等到服务器 B returns 'FREE' 响应(轮询 B 是服务器 A 中的后台作业)。一旦服务器 A 收到来自 B 的 'FREE' 响应,它就会向用户发送一封电子邮件。
如何在服务器 A 中实现这一点,请记住并发用户数可能会变大?
我建议你使用议程。 https://www.npmjs.com/package/agenda 使用议程,您可以创建重复的时间表,您可以在其中安排任何非常灵活的事情。
我建议您使用请求模块来发出 HTTP get/post 请求。 https://www.npmjs.com/package/request
根据 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 Create a Node.js Cluster for Speeding Up Your Apps
使用 request、superagent 或 restify-clients 等库来调用服务器 B。我建议您避免轮询,而是在调用 B 时使用 webhook(假设您也在编写 B)。如果您不能更改 B,则可以使用 setTimeout 以 1 秒为间隔安排后续调用。