c#-如果DateTime.Now不够好怎么办?
作者:互联网
好的,这就是问题所在.我们正在使用带有事件源的CQRS,并且正在使用聚合实例的每个提交序列的事件流.每个流都保留了各自的创建日期,但事实是,所有这些流的发生都太快了,这意味着某些过程(注册,通知等)的一部分汇总事件流会出来.日期完全相同.因此,当我们不得不重播事件时,由于存在一些时间相关的事件流,因此按创建日期对流进行排序是无效的,但是事件发生的时间如此之快,以至于它们看起来像是并行发生的(这意味着我们使用了DateTime.UtcNow和日期等于十亿分之一秒).
对于那些不知道什么是CQRS或事件源的人
假设您有一个资源列表,并且每个项目都有其创建日期.
了解列表中项目的创建顺序至关重要.请记住,有多个线程在列表中创建和添加项目.问题是,当线程必须在列表中创建并添加两个项目时,它们的创建日期匹配,因此您无法正确地按日期对它们进行排序.顺便说一句,我个人电脑上的个人电脑DateTime.Now不等于服务器上的DateTime.Now.实际上,在一个同事上添加了25000次DateTime.Now到列表会导致列表的第一个和最后一个元素等于纳秒(完全匹配)
解决方法:
时间戳是有用的元数据.正如您所发现的那样,这不是一个可靠的订购标准.想象一下,您在计算机上提出了一些解决方案,但是现在必须使用两台计算机?您能否将它们的时钟保持在一纳秒之内?减?
在事件来源中,典型的保证是仅在单个流中对事件进行排序,例如一种骨料.无论如何,这是您的交易保证.为什么不只使用整数来跟踪流中每个事件的顺序?您的聚合可以生成它,因为它一直在跟踪所有事件.
如果要跨流排序,则必须集中生成该序列号(带有表示的耦合),或者接受多次读取多个流不会总是返回同一顺序内的事件,而只是返回一个流内的事件应该排序.
标签:event-store,cqrs,datetime,c,event-sourcing 来源: https://codeday.me/bug/20191123/2064796.html