从我的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函数执行之间共享一个对象?
答案 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以启用池化连接。