如何定期从一个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中如何实现这一点,请记住并发用户的数量可能会变大。
我build议你使用议程。 https://www.npmjs.com/package/agenda通过日程安排,您可以创build周期性日程安排,在该日程安排下,您可以安排任何相当灵活的任务。
我build议你使用请求模块来发送HTTP请求/发送请求。 https://www.npmjs.com/package/request
从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秒为间隔调度后续呼叫。