如何从 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

Node.js v7.10.0 Documentation :: cluster

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

使用 request、superagent 或 restify-clients 等库来调用服务器 B。我建议您避免轮询,而是在调用 B 时使用 webhook(假设您也在编写 B)。如果您不能更改 B,则可以使用 setTimeout 以 1 秒为间隔安排后续调用。