命令查询分隔验证重试

时间:2010-05-05 11:27:08

标签: design-patterns nservicebus cqrs

所以我对CQS的基本概念感到满意,在这个概念中你可能有一个写入一个数据库的命令,它会更新你读取的查询数据库。

但是,请考虑输入数据的方案,并希望防止重复。

使用新员工数据输入员工注册为例,通过一堆申请表来输入新员工的详细信息:

  1. 拿顶页。
  2. 键入员工姓名和UI的唯一工资核算号。
  3. 提交。
  4. 将纸张放入“完成的桩”中。
  5. 重复。
  6. 你现在如何阻止用户再次输入相同的工资单号码,例如,如果他们分心并且不记得他们是否已经键入了一个而且“消息”还没有全部返回查询数据库以供用户搜索?

4 个答案:

答案 0 :(得分:1)

数据输入是一个非协作域 - 您没有多个用户对同一个共享数据集执行操作。因此,CQRS并不特别重要。

答案 1 :(得分:1)

首先,您可以轻松使用本地缓存,以确保直接用户不会再次使用相同的数字。这很容易。

但实际上,这并不能阻止两个人同时使用同一个关键数据的错误。正如其他人提到的那样,这是在CQRS之外。这可能发生在几乎任何架构中。

现在CQRS可以改变的主要方面是我们如何应对冲突。我看到两种可能的解决方案:

  1. 系统关闭命令然后等待成功结果。如果失败,您只需要提供固定信息并再试一次。从我所听到的一切看来,这似乎都是错误的,甚至可能是一种反模式,虽然我不是那么接近专家的说法。

  2. 系统关闭命令并最终通知用户冲突。他们可以在某处解决问题。在您的情况下,输入一个新号码(可能会再次发生冲突)。

答案 2 :(得分:0)

我建议将工作流程更改为此

  1. 检查顶层是否在数据库中进行(您应该有一个表R来记住是否采用了特定的行),如果采用则返回false   如果没有,那么拿顶页。并在表R
  2. 中设置所采取行的标记
  3. 键入员工姓名和UI的唯一工资核算号。
  4. 提交。
  5. 将纸张放入“完成的桩”中。
  6. 重复。
  7. 该步骤应该以原子方式执行。

答案 3 :(得分:0)

您是否可以跟踪客户端上已输入的员工/工资单号码组合的列表?如果这是一个Web客户端,可以是cookie,如果是胖客户端,则是内存或其他。当他们第一次进入系统时,清除列表并重新开始。