体系结构问题 - Azure 服务总线和消息顺序保证

Architecture issue - Azure servicebus and message order guarantee

好的,我对服务总线比较陌生。在我们使用 Azure 服务总线对消息进行排队的项目中工作。我们的架构大致如下所示:

所以我们的想法是,在我们的 SourceSystem 中会发生各种事情,这会导致将消息放在服务总线主题上。现在我们的责任是将这些事件同步到外部客户端,以便他们知道我们在做什么。

现在的问题是,目前我们不使用服务总线 session,因此无法保证消息顺序。还要考虑以下情况:

已创建订单 订单更新 1 订单更新 2 已关闭订单

现在发生的情况是,如果外部客户端 API 因 OrderUpdate 1 和 OrderUpdate 2 而关闭,我们可能会按顺序发送消息:OrderCreated、OrderClosed、OrderUpdate 1、OrderUpdate 2。

目前我们只是重试消息几次,然后将其移入死信队列以进行手动重新处理。

我们应该采取哪些措施来更好地保证消息的顺序?感觉在一个订单的范围内,需要保证消息的顺序。

我们是否应该强制源系统将订单的所有消息放入服务总线 session?但是我们如何处理多个主题呢?如果来自 session 的消息 1 在死信中结束,我们该怎么办?

这里有很多注意事项,我们是否应该使用单个主题以便于管理 sessions?但这会带来其他问题,不同的消息结构在一个主题中?

我很想听听你对此的看法

如果外部客户端必须接收所有这些事件和订单事项,将这些消息发送到多个主题(其中一个主题是每个消息类型)将使您的任务极难完成。对于有序的消息传递,您首先需要使用启用了 Sessions 的单个实体(队列或主题)。这样你就可以保证有序的消息处理。如果您有多个外部客户端,则每个外部客户端都需要一个启用会话的实体(主题)。

另一种选择是实施称为 Process Manager 的模式。流程经理将负责对传入消息做出决定,并在给定订单的工作完成或未完成时得出结论。

还有一些库(MassTransit、NServiceBus 等)可以为您提供帮助。 NServiceBus 通过名为 Saga (tutorial) and MassTransit has it as well (documentation) 的功能实现 Process Manager。

看看 Azure 中的 Durable Functions。您可以使用 'Async Http API' 或其他模式之一来实现您需要执行的编排。 NServicebus 的 Sagas 也可能是一个不错的选择,这里有一篇文章在 NServicebus 和 Durable Functions 之间做了 very good comparison