如何定期从node.js服务器轮询其他服务器?

时间:2017-05-17 11:08:47

标签: node.js polling

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

当用户点击服务器 A 中的特定API端点(比如POST / test)时,我希望每次都开始轮询服务器 B 的状态API分钟,直到服务器 B 返回'免费'作为回应。用户不需要等到服务器 B 返回' FREE'响应(轮询B是服务器A中的后台作业)。一旦服务器 A 获得免费'来自 B 的回复,它将向用户发送电子邮件。

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

3 个答案:

答案 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

Node.js v7.10.0 Documentation :: cluster

ActionHero.js :: Fantastic node.js framework for implementing an API, background tasks, cluster using http, sockets, websockets

答案 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秒的间隔安排后续呼叫。