我有一个 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/