当前位置: 首页 > 知识库问答 >
问题:

发送命令时,CQRS事件源检查用户名是否来自EventStore

周阳波
2023-03-14

当我们有特定唯一的EntityID时,EventSourcing工作得很好,但当我试图从eventStore获得特定EntityID以外的信息时,我就很难了。

我使用CQRS与EventSourcing。作为事件源的一部分,我们将事件存储在SQL表中作为列(EntityID(uniqueKey),EventType,EventObject(如UserAdded))。

因此,在存储EventObject时,我们只是序列化DotNet对象并将其存储在SQL中,因此,与UserAdded事件相关的所有细节都将采用xml格式。我关心的是我想确保用户名,这是存在于数据库应该是唯一的。

但是作为CQRS的一部分,命令不允许查询可能是因为争用条件。

因此,在发送AddUser命令之前,我尝试查询eventStore并通过序列化所有事件(UserAdded)获得所有用户名,然后获取用户名,如果请求的用户名是唯一的,则执行shot命令,否则抛出用户名已经存在的异常

与上述方法一样,我们需要查询整个数据库,并且我们可能有成千上万的事件/天,因此查询/反序列化的执行将花费大量的时间,这将导致性能问题。

我正在寻找任何更好的方法/建议来保持用户名的唯一性,无论是从eventStore或任何其他方法获得所有用户名

共有1个答案

端木兴国
2023-03-14

因此,您的客户机(发出命令的对象)应该完全相信它发送的命令将被执行,并且必须确保在发送RegisterUserCommand之前,没有其他用户使用该电子邮件地址注册。换句话说,您的客户机必须执行验证,而不是您的域,甚至域周围的应用程序服务。

摘自http://cqrs.nu/faq

这是一个经常出现的问题,因为我们没有在写端显式地执行跨聚合操作。然而,我们确实有许多选择:

 类似资料:
  • 很明显,基于这些模式的系统是易于扩展的。但我想问你,具体怎么做?关于可伸缩性,我没有什么问题: 如何缩放聚合体?如果我将创建

  • 我想创建一个CQRS和事件源架构,非常便宜,非常灵活,非常简单。 我想确保事件永远不会失败,至少到达发布者/事件存储,永远,因为这是业务所在。 天蓝 有了azure,我似乎不知道该用什么。 Azure服务总线 蔚蓝函数 Azure webjob(我想这可以用Azure函数代替) ??(还有什么我忘了或者不知道的?) null 你的经验说明了什么? 其他替代方案呢?(例如:)?

  • 我在CQRS/ES设计中有一个计时案例。为了便于讨论,让我们以Microsoft关于这个主题的示例会议管理为基础(https://msdn.microsoft.com/en-us/library/jj554200.aspx)。 假设在第1分钟创建会议(最大座位数为20)。 在第4分钟,事件到达order mgmt上下文,因此创建了一个座位可用性。 在第7分钟,用户下了一个订单(通过订单管理),购买

  • 当我在读一些CQRS的资料时,有一个反复出现的问题我没有理解。例如,假设一个客户端发出一个命令。该命令由域集成,因此它可以刷新其域模型(DM)。另一方面,命令保存在事件存储中。这是最常见的情况。 1) 当我们说DM被刷新时,我假设数据被保存在底层数据库中(如果有的话)。我说得对吗?否则,我们将处理内存瞬态模型,我想这不是一件好事吗?(在客户端请求之外,状态不应该保留在服务器端的内存中)。 2)如果

  • 问题内容: 我有一个附加到事件的处理程序,我希望它仅在由人触发而不是由trigger()方法触发时执行。我该如何区分? 例如, 问题答案: 您可以检查:如果已定义,则点击是人为的: 我在jsfiddle中的例子:

  • 问题内容: 我有带有文本框用户名的注册表。我要做的是,当用户输入用户名时,自定义指令将检查输入的用户名是否存在于数据库中。 指令.js 如果存在,我将在html表单中显示标签“用户名已存在”。 registration.html 但是现在,他们不能正常工作:-(,我在做对吗? 问题答案: yearofmoo提供 了一个很棒的教程, 介绍 有关angular1.3中的$ asyncvalidator