首页 > 解决方案 > Azure 函数:限制并发服务总线消息的数量

问题描述

我正在开发一个 Azure 函数,它从基于会话的服务总线主题触发并通过 API 请求将数据发送到 CRM 系统。CRM 的 API 有使用和负载保护限制,我们可能会在短时间内收到大量消息,因此我正在寻找限制该功能的最佳方法。

我认为 host.json 中的 maxConcurrentSessions 设置可能对我有帮助,我可以一次将其限制为大约 20 条消息。我还可以查看 Function App 中的“强制横向扩展限制”,但我想这不一定会限制一次处理的消息数量。maxConcurrentSessions 会是最好的设置,还是有其他考虑?

另一种方法(可能除了上述方法之外)是在我达到 API 限制后的一段时间内“暂停”或停止函数接收更多消息。有谁知道是否可以以编程方式实时暂停 Azure 函数的执行,或者阻止它接收更多消息?

标签: azureazure-functionsazureservicebus

解决方案


我认为 host.json 中的 maxConcurrentSessions 设置可能对我有帮助,我可以一次将其限制为大约 20 条消息。我还可以查看 Function App 中的“强制横向扩展限制”,但我想这不一定会限制一次处理的消息数量。maxConcurrentSessions 会是最好的设置,还是有其他考虑?

您可以使用 maxConcurrentCalls 来限制消息泵应启动的回调的最大并发调用数。默认情况下,Functions 运行时同时处理多条消息。如果设置为 1,它将一次只处理一个队列或主题消息。

结构如下:

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "prefetchCount": 100,
            "messageHandlerOptions": {
                "autoComplete": true,
                "maxConcurrentCalls": 1,
                "maxAutoRenewDuration": "00:05:00"
            },
            "sessionHandlerOptions": {
                "autoComplete": true,
                "messageWaitTimeout": "00:00:30",
                "maxAutoRenewDuration": "00:55:00",
                "maxConcurrentSessions": 1
            }
        }
    }
}

同时,您可以将Maximum Scale Out Limit设置为较小的值,以防止函数在高负载下扩展。


推荐阅读