节点 http.createServer 如何缓冲传入请求

Node http.createServer how to buffer incoming requests

我正在构建一个生成 PDF 文件的小型节点服务器(使用 Nightmare.js)。每个请求调用 createPage 生成一个 pdf。

传入的请求往往会同时出现,使 运行 上的 PC 过载。

我需要缓冲传入的请求以延迟某些请求的执行,直到某些当前请求已完成。我该怎么做?

function createPage(o, final) {
    //generate pdf files
}

http.createServer(function (request, response) {
    var body = [];
    request.on('data', function (chunk) { 
        body.push(chunk);
    }).on('end', function () {
        body = Buffer.concat(body).toString();
        var json = JSON.parse(body);

        createPage(json, function (status) {
            if (status === true) {
                response.writeHead(200, { 'Content-Length': 0 });
                console.log('status good');
            } else {
                response.writeHead(500, { 'Content-Type': 'text/html' });
                response.write(' ' + status);
            }
            response.end('\nEnd of Request \n');
       });
   });
}).listen(8007);

如果我理解正确的话,您希望持续接受 http 请求但限制调用 createPage 的速率。如果是这样,您可能需要考虑稍微不同的设计。在当前的设计中,每个下一个客户端都必须比前一个客户端等待更长的时间才能确定他们的请求是成功还是失败。

方法一: 使用队列(rabbitmq、aws sqs、zeromq、kafka 等)。 以下是基本工作流程:

  1. 收到请求
  2. 生成唯一 ID
  3. 将包含数据和唯一 ID 的消息放入队列
  4. return客户端的唯一标识
  5. 客户端使用唯一id定期检查任务是否完成

方法二: 使用具有消息双工的队列。

  1. 收到请求
  2. 生成关联 ID 并将其关联到 http 事务
  3. 将队列中的消息发送给具有关联 ID 的工作人员
  4. 当 worker 完成时,它会发回带有关联 ID 的响应
  5. 服务器使用关联 ID 查找 http 事务并向客户端发送适当的响应