【问题标题】:Recreate a graph that change in time重新创建随时间变化的图表
【发布时间】:2011-03-15 23:49:43
【问题描述】:

我的域中有一个代表城市电网的实体。实际上,我的模型是一个包含断路器、变压器、线路的列表的实体。

每次断路器打开/关闭时网络都会发生变化,用户可以更改连接等...

在 CQRS 的所有示例中,使用 Version 和 aggregateId 查询 EventStore。

您认为我必须只为“网络”聚合或每个“可连接”项目实现事件吗?

在这种情况下,当我必须重播所有事件以获得“实际”状态(基于日期)时,我可以处理近 10000-20000 个事件。

一个事件修改一个属性还是我需要一个事件来修改一个对象(包含对象的所有属性)?

【问题讨论】:

    标签: cqrs


    【解决方案1】:

    规则总是有一个例外,但我认为您需要为您的域中处理的每个命令设置一个事件。您可以通过使用快照来解决处理如此多事件的问题。

    http://thinkbeforecoding.com/post/2010/02/25/Event-Sourcing-and-CQRS-Snapshots

    【讨论】:

    • 当您的 SLA 非常低时,快照是一种性能优化。如果加载所有 20K 事件需要 1/2 秒并不重要,那么您根本不应该为快照而烦恼。
    • 我看到了一些 EventStore 实现,但是......都需要 StreamId 或 AggregateId。可能我必须创建一个在我的模型中发生的单一且独特的事件流,因为我的实体可以聚合在一个独特的“网络”实体中。组成网络的实体必须可以从网络访问,它在网络之外没有任何意义。可能我必须创建我的自定义 EventStore .. 我希望不会太难
    【解决方案2】:

    我假设您的意思是目前您的“可连接项目”是“网络”聚合的一部分,您问它们是否应该是它们自己的聚合?这实际上取决于您的系统和问题的性质,并且更多的是 DDD 问题,而不是简单的 CQRS 问题。但是,如果您的更改的性质通常是对彼此独立的项目进行操作,那么可能应该是聚合根本身。无论如何,为了回答这个问题,我们需要更多地了解您正在建模的系统。

    至于重播数千个事件的挑战,您当然不必为每个命令重播所有事件。当然快照是一种选择,但更好的是在首次加载聚合根对象后缓存内存中的聚合根对象,以确保您不必从每个命令的事件中获取源(除非系统崩溃,在在这种情况下,您可以依靠快照来更快地恢复,尽管您可能不需要它们进行缓存,因为您只需支付加载一次的代价。

    现在,如果您将这个系统分发到多个主机或线程,还有一些其他问题需要考虑,但我认为最好留给其他问题或论坛讨论。

    最后你问(我认为)一个事件可以修改对象状态的多个属性吗?是的,如果根据该事件所代表的意义,那是有意义的。事件的概念很简单,它代表聚合中的状态变化,但是这些事件也应该代表对业务有意义的概念。

    希望对你有帮助。

    【讨论】:

    • 克里斯是对的。您的域模型可以使用一些工作。在 DDD 中,一切都与业务行为有关。仅仅因为 A 包含 B 在现实生活中并不意味着我们的软件应该是那样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2011-03-19
    • 2019-03-31
    相关资源
    最近更新 更多