我的域中有一个代表城市电网的实体。实际上我的模型是一个包含断路器,变压器,线路的List的实体。
每次打开/关闭断路器时,网络都会发生变化,用户可以更改连接等......
在CQRS的所有示例中,使用Version和aggregateId查询EventStore。
您认为我必须仅针对“网络”聚合或每个“可连接”项目实施事件吗?
在这种情况下,当我必须重播所有事件以获得“实际”状态(基于日期)时,我可以处理10000-20000个事件。
一个事件修改一个属性或者我需要一个修改对象的事件(包含该对象的所有属性)?
答案 0 :(得分:1)
Theres始终是规则的例外,但我认为您需要为您域中处理的每个命令设置一个事件。您可以通过使用快照来解决处理这么多事件的问题。
http://thinkbeforecoding.com/post/2010/02/25/Event-Sourcing-and-CQRS-Snapshots
答案 1 :(得分:1)
我认为你的意思是目前你的“可连接项目”是“网络”聚合的一部分,你问他们是否应该是他们自己的聚合?这实际上取决于您的系统和问题的性质,而不仅仅是简单的CQRS问题。但是,如果您的更改的性质通常是彼此独立地对项目进行操作,那么那么它们本身应该是聚合根。无论为了回答这个问题,我们都需要了解您正在建模的系统。
对于重放数千个事件的挑战,您当然不必为每个命令重播所有事件。肯定的快照是一个选项,但更好的是缓存首次加载后的内存中的聚合根对象,以确保您不必从每个命令的事件源(除非系统崩溃,在在哪种情况下,你可以依靠快照来加快恢复速度,虽然你可能不需要缓存,因为你只需支付加载一次的罚款。)
现在,如果您要跨多个主机或线程分发此系统,还需要考虑其他一些问题,但我认为最好将讨论留给另一个问题或论坛。
最后你问(我认为)一个事件可以修改一个对象状态的多个属性吗?是的,如果这是基于该事件代表什么是有意义的。事件的概念仅仅是它代表了聚合中的状态变化,但是这些事件也应该代表对业务有意义的概念。
我希望有所帮助。