我正在构建一个解决方案,它基于Azure服务总线队列中的消息处理对记录的更改。队列包含用于更改多个不同记录的交错消息序列,并在每条消息中触发Azure函数以处理更改并将其存储在后端服务中。变更队列上的每条消息都与单个记录相关,并包含一个属性:recordId。
问题是,使用每条消息调用后端服务有一定的开销,而且经常会有多条消息出现在队列中,以便快速连续地保存单个记录。我希望允许对每个记录进行多个“缓冲区”更改,这样可以减少后端服务的调用频率,但需要进行一批更改。
我正在使用带有Azure函数的服务总线( 会话特征 of Service Bus ),在使用recordId作为会话名称将每条消息转发到会话队列之前监视更改队列。理想情况下,我希望消息在会话队列中缓冲,直到:
recordId,有一段时间是安静的(例如,10秒内没有变化)问题是:如何根据这些场景触发每个会话的处理?我已经研究过使用预定消息来处理第一个场景,但是接下来我需要一种可靠的重新调度方法来创建一个滑动超时。类似地,除了在某个地方存储计数器之外,似乎没有一种很好的方法来监视会话的大小。
我试图完全使用服务总线和函数来解决这个问题,尽管我对任何其他想法都很开放。
发布于 2022-04-08 17:30:58
您想要实现的目标与服务意图和功能之间存在不匹配。让我们先来看看会议。
会话打算按照发送的顺序处理消息。这是Azure服务总线在无序队列之上为您提供FIFO队列的一种方式,您通常会得到并消除竞争消费者处理消息的机会,从而导致无序处理。会话消息从队列中“耗尽”,在使用最后一个队列之后,在配置的会话超时之后,会话的使用者将转移到下一个可用会话。
计划消息是未来为延迟处理而发送的消息。调度是在每条消息基础上完成的,不能应用于组(如会话)。您当然可以安排日程安排大致相同的时间,但这将是棘手的-如何知道什么时候安排第一条消息,当你还没有收到最后一条消息。
带函数的批处理接收是一种请求向上的方法--向发送一批消息,并不意味着您将得到确切的数字。如果会话的所有消息都在队列中,则会话和批处理接收的组合可以工作。虽然您可能不会在单个函数执行中处理与给定会话相关的所有消息,但仍然会按照发送这些消息的顺序和频率进行处理。
总之,您可以通过将IsBatched和IsSessionsEnabled设置为true来减少函数调用的数量,并将消息按发送的相同顺序分批传递以进行处理。
https://stackoverflow.com/questions/71800802
复制相似问题