【问题标题】:Throttling ServiceBusTrigger when using sessions使用会话时限制 ServiceBusTrigger
【发布时间】: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
    }
  }

但这有以下问题

  1. 一次允许 16 条消息(2 个会话 * 8 条并发消息)
  2. 处理完该会话的两条消息后,该会话将空闲 X 秒,然后取消其订阅,然后获取一个新消息以处理更多消息。
  3. 它将所有非会话队列/主题限制为 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


【解决方案1】:

您可以更改属性SessionIdleTimeoutReference.

更改此属性,代码可以减少等待其他会话的消息,并会加快处理速度。

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多