gpt4 book ai didi

c# - 领域事件的并发问题

转载 作者:行者123 更新时间:2023-11-30 16:56:43 24 4
gpt4 key购买 nike

我有许多领域事件可以在我们的企业系统中调度。例如,如果有人创建或删除地址。

我应该将整个实体作为事件的一部分传递还是应该只传递 ID。消息通过服务总线发送并并行使用。

如果我只是发送 ID,那么如果同时发生删除,则该实体在消费者端可能不可用。我总是可以只使用一个事件标志并将其设置为 false 但是如果实体同时更新并且它改变了一些重要的东西怎么办。

我将如何处理这些案例?

最佳答案

我认为这是服务总线上常见的困境,而且我相信没有完美的解决方案。我假设这里的范围只是重要域对象更改状态时引发的事件(即不是事务命令,也不是读取/数据服务)

只发送事件元数据而不是发送完整的引用消息(例如新的客户聚合根)的决定可能具有比仅与延迟相关的并发/版本控制问题更广泛的影响,例如两种方法的一些优缺点:

最小的事件元数据:

  • 具有更小的有效负载(如果您审计总线上的所有消息尤其有用)
  • 非常适合标准信封
  • 如果交付给未经授权的总线端点,则相当安全(系统获得的只是客户 XYZ 已更改的信息,而不是实际详细信息)。

鉴于完整的“聚合”根 Message 引用更新

  • 如果大多数订阅者对完整有效负载不感兴趣,则可能会矫枉过正。
  • 潜在的安全问题 - 并非总线上的所有订阅者都有权获得全部有效载荷
  • 但这对于补充 CQRS 读取存储缓存非常有用,因为一旦端点知道其数据已过时,就无需返回真实来源来获取数据 - 数据已经提供。

所以我想最终的决定将取决于您主要打算对 EDA 事件执行的操作(保持 CQRS 缓存更新与触发 BPM 工作流与监控 CEP 规则等)。您可能决定使用混合动力车,例如广泛广播事件数据,然后将完整的消息仅路由到受信任的端点(事件元数据可能会从完整的有效负载中转换出来,因此起源/真相来源系统可以在每次状态更改后仅向总线发送一个消息有效负载) .

要回答您的数据一致性问题,我相信您需要接受数据最终只会保持一致,而延迟会导致整个企业出现暂时的不一致。我认为这里最好的模式是为从原始真相来源获得的每条消息添加哈希或时间戳,这需要添加到任何使用此版本数据作为假设的命令。

然后,当命令处理系统处理命令时,它可以根据当前的“真实”版本检查此哈希(基于实际的业务线系统数据库,而不是针对读取存储缓存),并且需要失败散列/时间戳不匹配时的命令 - 即乐观并发模式。

关于c# - 领域事件的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27602637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com