azure - 如何通过 Azure 服务总线 session 避免饥饿

标签 azure azure-functions azureservicebus azure-servicebus-queues

我有一个 Azure Function 作为 ServiceBusTrigger,正在监听启用了 session 的队列。

生产者可以发送具有多种 session ID 的消息(假设 session ID 有 1,000 个不同的值)。

默认情况下,Azure Function 主机将允许处理 8 个并发 session 。

这意味着在 1,000 个 session ID 中,在任何给定时间只会处理 8 个。因此,当 Azure Function 主机启动时,前 8 个 session ID 将处理其消息。如果这些 session ID 之一空闲一分钟(即,如果这些 session ID 之一超过一分钟没有消息),则其锁定将被释放,并且新 session (第九个)将拥有其消息已处理。

这意味着,如果前 8 个 session ID 每分钟至少收到一条消息,则它们的锁将不会被释放,并且它们的消费者将不允许处理另一个 session ID,从而留下所有剩余的 992 个 session ID挨饿(即他们永远没有机会处理他们的消息)。

显然,我可以更新我的 host.json,以便将 maxConcurrentSessions 设置为 1,000。但我不喜欢这个解决方案,因为这意味着我的配置是根据系统当前的要求进行硬编码的,但这些要求可能会随着时间的推移而变化,即我必须找到一种方法来监控 session ID 是否不足,因为从现在起 6 个月后,也许我需要将 maxConcurrentSessions 增加到 2,000

我正在寻找一种能够自动调整的机制。例如,在我看来,Azure 服务总线扩展缺少一个表示锁的最大生存时间的设置。例如,我应该被允许指定如下内容:

{
  "extensions": {
    "serviceBus": {
      "sessionIdleTimeout": "00:00:15",
      "sessionTimeToLive":  "00:00:30"
    }
  }
}

对于这样的配置,我基本上想说的是,如果一个 session ID 在 15 秒内没有收到消息,那么它的锁应该被释放,以便另一个 session ID 有机会处理。此外,TTL 也会起作用,因为如果同一个 session ID 每秒不断地接收新消息,那么它的锁将在 30 秒后被强制释放,尽管该 session ID 有更多消息需要处理;这样,另一个 session ID 就有机会进行处理。

据我所知,鉴于 Azure 服务总线中没有任何功能与 sessionTimeToLive 等效的功能,有人知道我应该如何处理这个问题吗?

最佳答案

实体锁定持续时间与“maxAutoLockRenewalDuration”设置相结合的行为已经类似于建议的“sessionTimeToLive”。默认情况下,“maxAutoLockRenewalDuration”设置为 5 分钟,但您可以将其设置为较低的值(如果您根本不希望更新锁定,则设置为 0)。

本质上, session 的最大处理时间为 Max(LockDuration, MaxAutoLockRenewalDuration)。

关于azure - 如何通过 Azure 服务总线 session 避免饥饿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75078142/

相关文章:

azure - 使用 Databricks 从 Azure EventHubs Capture 生成的 Azure Data Lake Gen1 读取 avro 数据失败

php - 从 api.microsofttranslator.com 到 Symfony 上的 azure 认知服务 Translator Text API

azureservicebus - Azure 服务总线客户端可以连接到 ActiveMQ AMQP 队列吗?

java - 从 Azure 服务总线队列接收 NULL 消息正文内容

java - 使用 Spring Cloud Stream 的 Azure 服务总线重试策略

azure - Azure ServiceFabric 中的反向代理与 ServicePartitionClient(用于 HTTP)

azure - json.Marshal() : json: error calling MarshalJSON for type msgraph. 应用程序

c# - 使用 C# 中的 v4 函数应用从 Azure 表存储获取包含所有数据集的完整表

azure - 运行 azure 函数时 Intellij 中出现错误 "Failed to get version of function(null)"

c# - 将数组发布到 Azure Function HTTP 触发器返回 500 状态代码