优化以批处理模式从 Azure 服务总线接收消息

Optmize receiving messages from Azure Service Bus in batch mode

我们有一个包含 200K+ 消息的服务总线(标准计划)队列。我们想以 2k-5K 的批次从服务总线读取消息,并使用 Azure 函数(每 30 分钟)将其分批插入 SQL Db。

大多数情况下,ReceiveMessagesAsync returns 几百条消息有时会变成一位数。我知道 maxMessages 参数不能保证消息数,但我仍然想知道是否有任何方法可以优化它 returns 至少是最大消息数的 50%。

现在,我在循环中使用 ReceiveMessagesAsync,一旦我有 5K+ 行就点击 Db 以减少 Db 调用的次数。请推荐是否有任何其他选项可以优化此过程。

var receivedMessages = await serviceBusReceiver.ReceiveMessagesAsync(maxMessages: 5000, maxWaitTime: TimeSpan.FromSeconds(1));

找到的预取设置为 5k。我增加了数量,但没有帮助。

短版是没有的,目前没有办法保证最小消息数returned.

其他上下文
当请求消息时,优先级是 return 快速向您的应用程序发送数据,以便已接收消息的锁定不会因等待填充批次所需的其他消息而过期,这样您的应用程序就不会坐以待毙。

客户端向网络传输请求所需的批处理大小,网络传输尝试在 ~20 毫秒内构建完整的批处理 window 从预取和 returning 之前的网络流当前可用的任何消息。如果在您指定的 maxWaitTime 中没有可用的消息,则不会 return 编辑任何消息。

预取可以通过使更多消息可用于批处理来提供帮助,但它们必须通过网络流式传输。根据消息的大小,可能需要一点时间才能流入足以填充预取缓存,如果您使用消息的速度快于网络可以传输它们的速度,缓存将 运行 干涸。

预取的一个重要注意事项是记住预取缓存中保存的消息已被服务锁定,如果使用速度不够快,这些锁就会过期。

想法和后续步骤
在您的场景中,应用程序似乎能够比网络流式传输消息更快地使用和处理消息以保持缓存满。

如果最大程度地减少数据库调用是您的目标,那么将预取设置为批量大小并将来自多个接收调用的消息收集到 5,000 个批量中可能是最简单和最安全的方法。根据您达到批量大小的速度,您可能需要更新您持有的邮件的锁。

另一种可能的选择是考虑增加预取并在接收调用之间引入延迟以让缓存重新填充,但我不会这样做;这里的挑战是您无法看到您负责的消息锁并且无法更新锁,因此它不会那么可靠。