Azure Functions [JavaScript / Node.js] - HTTP调用,良好实践

时间:2017-12-20 12:48:59

标签: javascript node.js azure azure-functions

从我的Azure功能(在Node.js中运行,由EventHub消息触发)我想向一些外部页面发布一个帖子请求。 类似的东西:

module.exports = function (context, eventHubMessages) {

var http = require("http");

context.log('JavaScript Function triggered by eventHub messages ');

http.request(post_options, function(res){
    ...
})

context.done();

上面的代码可能会有效,但我怀疑这不是反模式。

想象一下,在短时间内触发了数千个函数的情况 - 对于每次执行,我们需要创建一个HTTP客户端并创建一个连接......

通过简短的研究,我找到了一些C#Azure功能的解决方案:https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/ 它使用静态HttpClient类。

我有一个问题,Node.js Azure功能中是否有类似的方法?或者任何其他方法来避免这个问题,在Node.js Azure函数执行之间共享一个对象?

1 个答案:

答案 0 :(得分:3)

如果在短时间内触发了数千个函数,则应通过修改http.globalAgent或传递新Agent

的实例来限制套接字
  

代理负责管理连接持久性和重用   对于HTTP客户端。它维护给定的待处理请求队列   主机和端口,重复使用单个套接字连接,直到   queue为空,此时套接字被销毁或放置   进入一个池,在那里它可以再次用于对它的请求   主机和端口。它是被摧毁还是汇集取决于   keepAlive选项。

来源:https://nodejs.org/api/http.html#http_class_http_agent

http.globalAgent.maxSockets默认为无穷大,因此除非您限制此值,否则您的函数将耗尽套接字,您将看到您的请求开始失败。 此外,如果您计划连接到同一主机,则应在globalAgent/Agent上启用keep-alive以启用池化连接。