您将如何解决 CQRS 架构中的以下问题:
现在,我如何确保每个订单仅由一项服务处理?
我会让服务发出命令
StartOrderProcessing(order)
.如果由于版本不同,另一个服务已经开始处理此订单,则此命令将在域中失败。但是,由于命令本质上是异步的,服务如何知道失败?
服务是否应该轮询读取模型以查看订单是否将其状态更改为正在处理?但是,由于它自己的命令而不是因为另一个服务的命令而改变了状态,该服务将如何改变状态?
UL:
处理订单的步骤:
2.1。调用邮箱
2.2.使用 DTMF 音导航邮箱菜单
2.3.识别邮箱发送的某些音频元素(如确认哔声)
2.4.播放在 1 中创建的问候语
该工作流被定义为 Windows Workflow Foundation 工作流,因为每个运营商的工作流都不同。
3.1。保存激活调用的录音
3.2.通过邮件通知用户成功
4.1。保存失败的激活调用和失败原因的记录
4.2.如果这是第一次尝试,请安排 Order 在 X 分钟内重试
4.3.如果这是第二次尝试,请通过邮件通知用户失败
最佳答案
首先,您需要整理出队,以便只有一个服务实例可以出队并处理订单。看看这个:http://www.eaipatterns.com/CompetingConsumers.html
例如,NServiceBus 为您提供了开箱即用的功能。
然后您可能想考虑您的订单处理。 开始订单处理 对我来说,这听起来不像是商业步骤。处理订单的真正步骤是什么?
订单的处理实际上可能是一个有限状态机。它有一个入口点和一个或多个退出条件。
看一下 saga 概念,其中聚合可以通过状态机并收集可以发送到域或其他有界上下文的信息,以便让他们做出决策,进而插入 saga 向前发展。
看看这个:https://github.com/haf/Documently/wiki/Sagas-SnowPloughExample
关于architecture - 只能由一项服务处理的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12055262/