在事件源系统中,事件形式的历史数据永远不会被丢弃。这样做可能会导致状态损坏。现在想象一下,有一项法院判决,说明需要删除一些数据(例如,搜索引擎必须删除隐私特定数据)。你会如何实现这一目标?
答案 0 :(得分:2)
到目前为止,我已经了解了两种可能性。
简单的第一部分:如果您正在使用事件源,那么您的所有数据视图都应该来自事件存储中的事件。因此,在您从事件存储库中清除受污染的数据后,您存储的所有用于读取的数据(缓存,屏幕,投影,报告)都会被吹走并重新生成。
所以你只需要找出那个部分。
首先,如果受污染的数据永远不会进入商店,您不必担心将其擦除。例如,敏感信息可以在密钥值存储中隔离;事件存储中对该数据的引用始终是通过代理键。当你需要擦洗时,键值存储中的数据被破坏,你有一堆事件指向不再可读的东西,你只需要确保你的读取模型可以继续运行如果引用的数据不是可用。
如果数据确实需要进入事件存储 - 因为它需要维护域模型的完整性 - 那么"聚合"或许可以提供帮助。
汇总是从ddd获取的一个想法,基本的想法是您的域可以分解为不需要直接共享数据的元素。聚合永远不会直接引用另一个数据;而是使用ID的间接引用;身份证本身就是另一个代理关键。
由于这些聚合彼此隔离,因此它们可以拥有自己的事件历史记录。在这种情况下,您可以通过简单地消除任何已被污染的聚合来清除污染数据。您只需删除事件流。
这样的回复并没有让你处于腐败状态,只是一个不一致的状态。一切仍在运行,只有一大堆数据丢失。
还有补偿事件的武器"可在工具包中找到;您可能能够引入一个新的事件流,使系统恢复到一致状态。例如,如果清理一堆交易会导致图书失去平衡,那么您可以发布一个针对iCouldTellYouButThen收取费用的事件....