首页 > 解决方案 > Azure 服务总线:会话序列的有序处理

问题描述

是否有任何推荐的服务总线架构模式来确保有序处理乱序发送的嵌套消息组?我们正在使用 Sessions,但是当涉及到确保一Sessions 必须按一定顺序依次处理,然后再转移到另一组 Sessions 时,架构很快就会变得很麻烦。这个问题最好用一个例子来说明。

我们正在使用服务总线将实时更改从数据库集成到第三方 API。每隔 N 分钟,我们就会收到来自数据库的新“批次”更改通知,其中包含跨不同实体的单独数据记录。然后我们转换/映射每条记录并将其发送到 API。例如,“批次”更改可能包括 5 个新的/更改的“人员”记录、3 个新的/更改的“成员”记录等。

在最外层,我们必须始终处理一整批数据,然后才能继续处理另一批数据,但我们也需要按特定顺序处理每种类型的实体。例如,必须先处理给定批次的所有“人员”更改,然后才能继续处理任何其他对象。

无法保证这些记录会以与需要如何处理相关的任何顺序排队,尤其是在“批量”更改中(例如,来自不同实体类型的数据将被交错)。

实际上,我们不一定需要以任何顺序将实体数据的单个记录发送到 API(例如,我发送该批次的这 5 个人员记录的顺序并不重要,只要它们都在 3 个成员资格之前发送该批次的记录)。但是,我们确实按实体类型将消息分组到会话中这样我们就可以保证给定会话中的同质记录并针对该实体类型的所有记录(这也有助于我们支持我们在调用 API 以尽可能发送一批记录时的单独要求,而不是每个记录单独调用避免 API 速率限制问题)。目前,我们包含记录数据的实际主题订阅被分解为实体类型批次所独有的会话。

"SessionId": "Batch1234\Person"

我们发现,在我们进入下一个批次之前,必须处理给定批次的所有更改的要求是很麻烦的,因为没有 Session 可以可靠地将这些“实体组”组合在一起(更不用说处理那些按特定顺序排列实体组)。当然,没有“会话会话”的概念,我们目前正在通过一个单独的“同步”队列来处理这个问题,以表示需要处理的整批更改,其中包含哪些数据会话批:

"SessionId": "Batch1234",
"Body":
{
  "targets": ["Batch1234\Person", "Batch1234\Membership", ...]
}

这非常麻烦,因为某些东西(例如,一个持久的 Azure 函数)现在必须通过观察同步队列然后分离它监督的单独处理器来编排整个过程,以确保每个级别的正确排序(这使得并发管理和可伸缩性很大处理起来更复杂)。如果这确实是一个好的模式,那么我不介意实施额外的编排架构以确保稳健、可扩展的实施。然而,我不禁觉得我错过了一些东西或没有以正确的方式思考架构。

是否有人知道服务总线中的任何其他推荐模式用于处理数据组的有序处理,这些数据组本身包含必须按特定顺序处理的数据组?

标签: azurearchitectureazure-functionsazureservicebus

解决方案


郑重声明,我不是服务巴士专家,特别是。

整个批次结构听起来很痛苦——你能取消它吗?通常,如果你有一个痛苦的输入,你就会有一个痛苦的解决方案——旧的“废话,废话”格言。有时很难找到一个优雅的解决方案。

是否需要按特定顺序处理“会话集”?是“一批”更改 = 一个会话吗?

我想不出一个具体的模式,但“分而治之”的方法似乎是合理的(这大致就是你已经拥有的?):

  • 注意新批次,当有新批次时将其交给BatchProcessor.
  • BatchProcessor如您所述,将所有规则应用于批次。
  • 考虑BatchProcessor将它的结果转储到作为 API 源的某种队列上 - 这样您就可以在批处理和 API 之间进行某种隔离。

推荐阅读