架构问题-Azure servicebus和消息顺序保证

架构问题-Azure servicebus和消息顺序保证,azure,exception,architecture,azureservicebus,dead-letter,Azure,Exception,Architecture,Azureservicebus,Dead Letter,好吧,我对servicebus还比较陌生。在一个项目中,我们使用Azure servicebus对消息进行排队。我们的架构大致如下所示: 因此,我们的想法是,在我们的源系统中,发生了各种各样的事情,这导致消息被放在servicebustopics上。现在,我们的责任是将这些事件同步到外部客户机,以便他们知道我们在做什么 现在的问题是,目前我们不使用servicebus会话,因此无法保证消息顺序。还考虑下面的场景: 订单创建 订单更新1 订单更新2 订单关闭 现在发生的情况是,如果OrderUp

好吧,我对servicebus还比较陌生。在一个项目中,我们使用Azure servicebus对消息进行排队。我们的架构大致如下所示:

因此,我们的想法是,在我们的源系统中,发生了各种各样的事情,这导致消息被放在servicebustopics上。现在,我们的责任是将这些事件同步到外部客户机,以便他们知道我们在做什么

现在的问题是,目前我们不使用servicebus会话,因此无法保证消息顺序。还考虑下面的场景:

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

现在发生的情况是,如果OrderUpdate 1和OrderUpdate 2的externalclients API关闭,我们可能会按顺序发送消息:OrderCreated、OrderClosed、OrderUpdate 1、OrderUpdate 2

目前,我们只需重试一条消息几次,然后它进入死信队列进行手动重新处理

我们应该采取哪些步骤来更好地保证邮件的顺序?我觉得在订单的范围内,需要保证消息的顺序

我们是否应该强制sourcesystem将订单的所有消息放入servicebus会话中?但我们如何处理多个主题?如果会话中的消息1以死信结尾,我们该怎么办

这里有很多考虑因素,我们是否应该使用一个主题以便更容易管理会话?但这会在单个主题中出现不同消息结构的其他问题吗


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

另一个选择是实现一个称为的模式。流程经理将负责对传入消息做出决策,并在给定订单的工作完成与否时得出结论


还有一些库(MassTransit、NServiceBus等)可以帮助您。NServiceBus通过一个名为Saga()的功能实现Process Manager,MassTransit也有它()。

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

另一个选择是实现一个称为的模式。流程经理将负责对传入消息做出决策,并在给定订单的工作完成与否时得出结论

还有一些库(MassTransit、NServiceBus等)可以帮助您。NServiceBus通过一个名为Saga()的功能实现Process Manager,MassTransit也有它()。

看看Azure。您可以使用“异步Http API”或其他模式之一来实现所需的编排。 NServicebus的传奇也可能是一个不错的选择,这里有一篇文章对NServicebus和持久功能进行了比较

在Azure中看一看。您可以使用“异步Http API”或其他模式之一来实现所需的编排。 NServicebus的传奇也可能是一个不错的选择,这里有一篇文章对NServicebus和持久功能进行了比较