Azure 服务总线中是否有缓冲相关消息以进行批处理的模式?

Is there a pattern for buffering related messages in Azure Service Bus for batch processing?

我正在构建一个解决方案,它根据放置在 Azure 服务总线队列中的消息处理对记录的更改。该队列包含一个交错的消息序列,用于更改多个不同的记录,并且每个消息都会触发一个 Azure 函数来处理更改并将它们存储在后端服务中。更改队列中的每条消息都与单个记录相关,并包含 属性:recordId.

问题是,使用每条消息调用后端服务会产生一些开销,并且通常多条消息快速连续地出现在单个记录的队列中。我想允许对每条记录的 'buffer' 进行多次更改,以便后端服务可以不那么频繁地被调用,但是有一批更改。

我正在考虑将服务总线的 Sessions feature 与 Azure 函数一起使用,在使用 recordId 作为会话名称将每条消息转发到会话队列之前监视更改队列。理想情况下,我希望消息在会话队列中缓冲,直到:

  1. recordId 有一段安静期(例如 10 秒内没有变化)
  2. 或者,会话大小已达到限制(例如记录更改 30 次)

问题是:如何根据这些场景触发每个会话的处理?我已经研究过使用 Scheduled Messages 来处理第一种情况,但随后我需要一种可靠的重新安排方式来创建滑动超时。同样,除了在某处存储一个计数器之外,似乎没有一种监视会话大小的好方法。

我正在尝试纯粹使用服务总线和函数来解决问题,尽管我对任何其他想法都持开放态度。

您想要实现的目标与服务意图和功能不匹配。先来看看session吧。

会话打算按照消息发送的顺序处理消息。这是 Azure 服务总线在您通常获得的无序队列之上为您提供 FIFO 队列的一种方式,并消除了竞争消费者处理消息的机会,导致 out-of-order 处理。会话消息从队列中“耗尽”,在最后一个消息被消耗后,在配置的会话超时后,会话的使用者将继续下一个可用会话。

预定消息是指在未来发送以延迟其处理的消息。调度是在 per-message 基础上完成的,不能应用于会话等组。您当然可以安排大致相同的时间安排,但这会很棘手 - 当您还没有收到最后一条消息时,您如何知道何时安排第一条消息。

带功能的批量接收是一种请求 up-to 一批消息的方法,并不意味着您会得到确切的数量。说会话和批量接收的组合可以工作如果会话的所有消息都在队列中。虽然您可能不会在单个函数执行中处理与给定会话关联的所有消息,但您仍然会以较低的频率和按发送这些消息的顺序处理。

总而言之,您可以通过将 IsBatchedIsSessionsEnabled 设置为 true 来减少函数调用量,并让消息按相同顺序分批传送以进行处理他们被发送了。