Azure 服务总线中是否有缓冲相关消息以进行批处理的模式?
Is there a pattern for buffering related messages in Azure Service Bus for batch processing?
我正在构建一个解决方案,它根据放置在 Azure 服务总线队列中的消息处理对记录的更改。该队列包含一个交错的消息序列,用于更改多个不同的记录,并且每个消息都会触发一个 Azure 函数来处理更改并将它们存储在后端服务中。更改队列中的每条消息都与单个记录相关,并包含 属性:recordId
.
问题是,使用每条消息调用后端服务会产生一些开销,并且通常多条消息快速连续地出现在单个记录的队列中。我想允许对每条记录的 'buffer' 进行多次更改,以便后端服务可以不那么频繁地被调用,但是有一批更改。
我正在考虑将服务总线的 Sessions feature 与 Azure 函数一起使用,在使用 recordId
作为会话名称将每条消息转发到会话队列之前监视更改队列。理想情况下,我希望消息在会话队列中缓冲,直到:
recordId
有一段安静期(例如 10 秒内没有变化)
- 或者,会话大小已达到限制(例如记录更改 30 次)
问题是:如何根据这些场景触发每个会话的处理?我已经研究过使用 Scheduled Messages 来处理第一种情况,但随后我需要一种可靠的重新安排方式来创建滑动超时。同样,除了在某处存储一个计数器之外,似乎没有一种监视会话大小的好方法。
我正在尝试纯粹使用服务总线和函数来解决问题,尽管我对任何其他想法都持开放态度。
您想要实现的目标与服务意图和功能不匹配。先来看看session吧。
会话打算按照消息发送的顺序处理消息。这是 Azure 服务总线在您通常获得的无序队列之上为您提供 FIFO 队列的一种方式,并消除了竞争消费者处理消息的机会,导致 out-of-order 处理。会话消息从队列中“耗尽”,在最后一个消息被消耗后,在配置的会话超时后,会话的使用者将继续下一个可用会话。
预定消息是指在未来发送以延迟其处理的消息。调度是在 per-message 基础上完成的,不能应用于会话等组。您当然可以安排大致相同的时间安排,但这会很棘手 - 当您还没有收到最后一条消息时,您如何知道何时安排第一条消息。
带功能的批量接收是一种请求 up-to 一批消息的方法,并不意味着您会得到确切的数量。说会话和批量接收的组合可以工作如果会话的所有消息都在队列中。虽然您可能不会在单个函数执行中处理与给定会话关联的所有消息,但您仍然会以较低的频率和按发送这些消息的顺序处理。
总而言之,您可以通过将 IsBatched
和 IsSessionsEnabled
设置为 true
来减少函数调用量,并让消息按相同顺序分批传送以进行处理他们被发送了。
我正在构建一个解决方案,它根据放置在 Azure 服务总线队列中的消息处理对记录的更改。该队列包含一个交错的消息序列,用于更改多个不同的记录,并且每个消息都会触发一个 Azure 函数来处理更改并将它们存储在后端服务中。更改队列中的每条消息都与单个记录相关,并包含 属性:recordId
.
问题是,使用每条消息调用后端服务会产生一些开销,并且通常多条消息快速连续地出现在单个记录的队列中。我想允许对每条记录的 'buffer' 进行多次更改,以便后端服务可以不那么频繁地被调用,但是有一批更改。
我正在考虑将服务总线的 Sessions feature 与 Azure 函数一起使用,在使用 recordId
作为会话名称将每条消息转发到会话队列之前监视更改队列。理想情况下,我希望消息在会话队列中缓冲,直到:
recordId
有一段安静期(例如 10 秒内没有变化)- 或者,会话大小已达到限制(例如记录更改 30 次)
问题是:如何根据这些场景触发每个会话的处理?我已经研究过使用 Scheduled Messages 来处理第一种情况,但随后我需要一种可靠的重新安排方式来创建滑动超时。同样,除了在某处存储一个计数器之外,似乎没有一种监视会话大小的好方法。
我正在尝试纯粹使用服务总线和函数来解决问题,尽管我对任何其他想法都持开放态度。
您想要实现的目标与服务意图和功能不匹配。先来看看session吧。
会话打算按照消息发送的顺序处理消息。这是 Azure 服务总线在您通常获得的无序队列之上为您提供 FIFO 队列的一种方式,并消除了竞争消费者处理消息的机会,导致 out-of-order 处理。会话消息从队列中“耗尽”,在最后一个消息被消耗后,在配置的会话超时后,会话的使用者将继续下一个可用会话。
预定消息是指在未来发送以延迟其处理的消息。调度是在 per-message 基础上完成的,不能应用于会话等组。您当然可以安排大致相同的时间安排,但这会很棘手 - 当您还没有收到最后一条消息时,您如何知道何时安排第一条消息。
带功能的批量接收是一种请求 up-to 一批消息的方法,并不意味着您会得到确切的数量。说会话和批量接收的组合可以工作如果会话的所有消息都在队列中。虽然您可能不会在单个函数执行中处理与给定会话关联的所有消息,但您仍然会以较低的频率和按发送这些消息的顺序处理。
总而言之,您可以通过将 IsBatched
和 IsSessionsEnabled
设置为 true
来减少函数调用量,并让消息按相同顺序分批传送以进行处理他们被发送了。