如何定期从一个node.js服务器轮询另一台服务器?

我有一个用于数据库的mongodb的node.js服务器A. 还有另一个远程服务器B (不需要是基于节点的),它暴露了一个HTTP / GET API“/ status”,并返回“FREE”或“BUSY”作为响应。

当用户点击服务器A中的一个特定的API端点(比如说POST /testing)时,我希望每分钟开始轮询服务器B的状态API,直到服务器B返回“FREE”作为响应。 用户不需要等到服务器B返回“FREE”响应(轮询B是服务器A中的后台作业)。 一旦服务器A得到B的“免费”响应,它就会向用户发送一封电子邮件。

在服务器A中如何实现这一点,请记住并发用户的数量可能会变大。

从node.js文档中的例子来看,我会使用类似代码的东西。 我testing过,它的工作原理。 顺便说一下,我假设在这里,答复是类似于{"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中的很多并发性,我build议实现一个集群或者使用一个框架。 这里有一些链接开始研究这个问题:

如何充分利用Node.js Web Apps的服务器容量

如何创build一个Node.js集群来加速你的应用程序

Node.js v7.10.0文档::集群

ActionHero.js :: Fantastic node.js框架,用于实现一个API,后台任务,集群使用http,套接字,websockets

使用类似于request,superagent或restify-clients的库来调用服务器B.我build议你避免轮询,而是在调用B时使用webhook(假设你也在创作B)。 如果您不能更改B,则可以使用setTimeout以1秒为间隔调度后续呼叫。