【发布时间】:2021-04-29 17:52:17
【问题描述】:
我有一个启用了会话的 ServiceBus 队列。每条消息上的 SessionId 都非常独特,因此在 10,000 条消息中将有 5,000 个唯一的 SessionId。
我想将消费者限制为最多 16 条并发消息,因此我将以下内容添加到我的 hosts 文件中。
"extensions": {
"serviceBus": {
"messageHandlerOptions": {
"maxConcurrentCalls": 16
},
}
}
问题在于它似乎是每个会话最多 16 个,而不是在任何给定时间总共 8 个。
因此,由于我的 Message.SessionId 如此独特,我看到数百条消息涌入,而不是一次只有 8 条。
我也试过设置maxConcurrentSessions,
"extensions": {
"serviceBus": {
"messageHandlerOptions": {
"maxConcurrentCalls": 8
},
"sessionHandlerOptions": {
"maxConcurrentSessions": 2
}
},
"queues": {
"maxDequeueCount": 8
}
}
但这有以下问题
- 一次允许 16 条消息(2 个会话 * 8 条并发消息)
- 处理完该会话的两条消息后,该会话将空闲 X 秒,然后取消其订阅,然后获取一个新消息以处理更多消息。
- 它将所有非会话队列/主题限制为 8 个并发消息。
我尝试了类似以下的方法。这确保了我不会同时处理太多消息,但是,我仍然收到很多消息,因此它们最终超时。
static SemaphoreSlim Semaphore = new SemaphoreSlim(16, 16);
[FunctionName("Do stuff")]
public async Task RunAsync(
[ServiceBusTrigger("My queue", IsSessionsEnabled = true)]
Message message)
{
await Semaphore.WaitAsync().ConfigureAwait(false);
try
{
Do the stuff here
}
finally
{
Semaphore.Release();
}
}
}
有没有办法让我的函数接收最多 X 个并发消息,而不管涉及多少会话?
【问题讨论】:
-
为什么要限制并发?您是否已经尝试过maxConcurrentRequests?可能并不完美,但取决于几件事。
-
@Kashyap 我可以为每个队列名称设置 maxConcurrentRequests 吗?
-
没有。请参阅链接的答案和该参数的文档。你也没有回答“你为什么要限制并发?”
标签: azure-functions azureservicebus