architecture - 只能由一项服务处理的项目

标签 architecture cqrs

您将如何解决 CQRS 架构中的以下问题:

  • 有一个名为 Order 的域实体。
  • 需要处理订单。
  • 新创建的订单未处理并在处理队列中
  • 每个订单不得多次处理。
  • 有多个 Windows 服务可以查询(读取事物的一面)以获取未处理的订单。

  • 现在,我如何确保每个订单仅由一项服务处理?

    我会让服务发出命令 StartOrderProcessing(order) .如果由于版本不同,另一个服务已经开始处理此订单,则此命令将在域中失败。
    但是,由于命令本质上是异步的,服务如何知道失败?

    服务是否应该轮询读取模型以查看订单是否将其状态更改为正在处理?但是,由于它自己的命令而不是因为另一个服务的命令而改变了状态,该服务将如何改变状态?

    UL:
  • 订单:我系统中的订单代表用户请求更新他/她邮箱上的问候语。
  • 邮箱:调用手机未接听时,跳转到邮箱留言
  • 问候语:当您到达邮箱时,您会收到一条短信,告诉您在哔声后留言。此文本(不是您的消息!)是问候语。
  • 激活:在邮箱中设置新问候语的过程称为激活。正在激活问候语。
  • 运营商:提供手机服务的公司,例如T移动。

  • 处理订单的步骤:
  • 从预先录制的声音位创建问候语。这取决于邮箱关联的运营商。
  • 执行运营商特定的工作流程以激活邮箱上的问候语。此工作流程具有以下元素:

    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/

    相关文章:

    architecture - AMQP是否适契约(Contract)时用作机器内和机器间软件总线?

    architecture - 选择数据库类型

    php - 动态生成PDF并将其存储在文件系统中?

    c# - CQRS 验证和唯一性

    oop - 如何设计索引表?

    web-applications - 您如何构建像 Firebase 这样的应用程序?

    domain-driven-design - 将 CQRS 命令直接传递给域对象

    cqrs - 如何在 CQRS 系统中引入新的事件反规范化器?

    azure - 如何在使用CQRS方法构建的系统中运行周期性任务?

    cqrs - 当读取模型与事件日志不同步时,如何处理情况?