node.js - 应该如何正确处理 Azure 函数中 Azure 服务总线/主题客户端的打开和关闭?
问题描述
我不确定管理与 Azure 服务总线交互所需的各种客户端的生命周期的正确方法。据我了解,需要管理三个不同但相似的客户端:ServiceBusClient、主题/队列/订阅服务,然后是某种发送者。在我的例子中,它的 TopicService 和一个 Sender。我应该在每条消息后关闭发件人吗?经过一定的停机时间?和所有其他人一样吗?我觉得我应该保持 ServiceBusClient 处于打开状态,直到功能完全完成,这样可能也会延续到主题客户端。有很多方法可以给这个皮肤贴皮,我不知道从哪里开始画线。我很确定这不是那么极端:
function sendMessage(message: SendableMessageInfo) {
let client=createServiceBusClientFromConnectionString(connectionString)
let tClient = createTopicClient(client);
const sender = tClient.createSender();
sender.send(message);
sender.close();
tClient.close();
client.close();
}
但是让所有东西一直保持打开状态似乎是等待发生的内存泄漏。我应该通过错误处理来处理这一切吗?Try-catch,然后在 finally 块中关闭所有内容?
我也可以只使用 Azure Function 绑定,如果我错了,请纠正我:
const productChanges: AzureFunction = async function (context: Context, products: product[]): Promise<void> {
context.bindings.product_changes = []
for (let product of product) {
if(product.updated) {
let message = this.createMessage(product)
context.bindings.product_changes.push(message)
}
}
context.done();
}
对于极高吞吐量的主题(激增,约 100,000 个请求/秒),我无法从文档或来源中找出更好的(在性能和财务方面)。
任何意见,将不胜感激!
解决方案
在我看来,我们最好使用 Azure 绑定或将客户端设置为静态,但不要每次都创建客户端。如果使用Azure绑定,我们不会考虑关闭发送者的问题,如果将客户端设置为静态,也可以。两种方案性能都不错,成本上没有区别(servicebus价格可以参考本教程:https ://azure.microsoft.com/en-us/pricing/details/service-bus/ )双打。希望对您的问题有所帮助。
推荐阅读
- javascript - 对背景作出反应,渲染不正确
- python-3.x - 由于超时而停止多次发送请求
- jekyll - 为什么我的共享导航栏中的图像路径会发生变化?
- api - Rundeck - HTTP 工作流步骤 API 令牌
- jekyll - 按日期过滤液体 (Jekyll)
- azure - 跳过 Luis 话语中拼写错误的单词
- swift - Swift inout 如何在未更改时不复制回属性,以不触发对象设置器
- php - Laravel - 如何从父数组中的子记录中检索?
- javascript - 性能问题:遵循点符号结构的组件库
- angular - 我应该在 Angular 中取消订阅 pipe() 吗?