首页 > 解决方案 > 应该如何正确处理 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 个请求/秒),我无法从文档或来源中找出更好的(在性能和财务方面)。

任何意见,将不胜感激!

标签: node.jstypescriptazureazure-functionsazureservicebus

解决方案


在我看来,我们最好使用 Azure 绑定或将客户端设置为静态,但不要每次都创建客户端。如果使用Azure绑定,我们不会考虑关闭发送者的问题,如果将客户端设置为静态,也可以。两种方案性能都不错,成本上没有区别(servicebus价格可以参考本教程:https ://azure.microsoft.com/en-us/pricing/details/service-bus/ )双打。希望对您的问题有所帮助。


推荐阅读