保持活动仅与出站请求有关吗?

时间:2019-06-13 12:52:11

标签: node.js google-cloud-functions

如果我的客户可能在相对较短的时间内多次向http Google Cloud Function发出请求,我该如何使用keep-alive?让客户端发送连接保持活动头足够吗?

我在Google文档中看到了这一点: https://cloud.google.com/functions/docs/bestpractices/networking

const http = require('http');
const agent = new http.Agent({keepAlive: true});

/**
 * HTTP Cloud Function that caches an HTTP agent to pool HTTP connections.
 *
 * @param {Object} req Cloud Function request context.
 * @param {Object} res Cloud Function response context.
 */
exports.connectionPooling = (req, res) => {
  req = http.request(
    {
      host: '',
      port: 80,
      path: '',
      method: 'GET',
      agent: agent,
    },
    resInner => {
      let rawData = '';
      resInner.setEncoding('utf8');
      resInner.on('data', chunk => {
        rawData += chunk;
      });
      resInner.on('end', () => {
        res.status(200).send(`Data: ${rawData}`);
      });
    }
  );
  req.on('error', e => {
    res.status(500).send(`Error: ${e.message}`);
  });
  req.end();
};

但是,这仅适用于从云功能发出出站请求吗?

这里还涉及全局(实例范围)范围: https://cloud.google.com/functions/docs/bestpractices/tips

我需要做些什么来重用最终用户发送的请求上的连接吗?

1 个答案:

答案 0 :(得分:0)

在函数的全局范围内定义agent时,该保留时间将一直保持不变,直到运行该服务器的任何给定服务器实例。因此,尽管您的连接可以在该实例中保持活动状态,但是当您的函数负载增加时,它将不会与分配的其他实例共享任何连接。您对Cloud Functions何时启动一个新实例来处理新负载或何时取消分配该实例没有直接的控制权。您只需要接受它们会随着时间的流逝以及所有由全局作用域对象保持活动状态的HTTP连接而来。