- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在使用 CQRS + ES。 ES 是 NEventStore(以前称为 JOliver EventStore)。我们在不同的命令中有 2 个聚合。第二个 AR 的投影取决于读取模型中第一个 AR 投影写入的数据。问题在于,当我们运行软件时,一切都进行得如此之快,以至于有时两个聚合会以相同的日期时间(CommitStamp 列)持久存在于事件存储中。当重放事件时,我们从 CommitStamp 列的开始顺序获取它们。但是,如果两个流具有相同的 CommitStamp 并且以错误的顺序获取,则读取模型预测会出现异常。
知道如何解决这个问题吗?
================================
这是github上关于这个问题的讨论
https://github.com/NEventStore/NEventStore/issues/170
================================
编辑 :这就是我们目前重播事件的方式。我搜索了 GetFrom(...) 的工作原理,结果发现 commitstamp 列不用于排序。毕竟没有提交顺序。因此,如果我开始重播事件,它可能会返回今天的事件,下一个 2 年前记录的事件,下一个等
public void ReplayEvents(Action<List<UncommittedEvent>> whatToDoWithEvents, DateTime loadEventsAfterDate)
{
var eventPortion = store.Advanced.GetFrom(loadEventsAfterDate);
var uncommitedEventStream = new UncommittedEventStream();
foreach (var commit in eventPortion)
{
foreach (var eventMessage in commit.Events.ToList()))
{
uncommitedEventStream.Append(new UncommittedEvent(eventMessage.Body));
}
}
whatToDoWithEvents(uncommitedEventStream.ToList());
}
最佳答案
在 NEventStore 中,一致性边界是流。从 3.2 版开始(如@Marijn 提到的, issue #159 ),当从所有持久性引擎的流中读取时,CommitSequence 列用于对 CommitMessages(以及其中包含的 EventMessages)进行排序。
EventMessage 排序在 上得到保证每流基础 .跨流的消息没有隐含的排序。由于所选持久性引擎的某些方面而可能发生的任何实际排序都是偶然的,不得依赖。
保证跨流排序将严重限制库的分布式友好方面。即使我们要考虑这样的功能,它也必须与所有支持的持久性引擎一起工作,其中包括 NoSQL 存储。
如果您正在实践领域驱动设计,其中每个流代表一个聚合根,并且您需要保证跨 2 个或更多聚合的排序,这表明您的领域模型中存在设计问题。
如果您的预测需要合并来自多个源(流)的值,您可以依赖于源内排序,但您需要灵活地对源间排序。您还应该考虑重复消息的可能性,尤其是当您通过外部总线或队列重播时。
如果您尝试使用时间戳 (CommitStamp) 在接收器端重新排序多个流,那将是脆弱的。时间戳具有固定的分辨率(毫秒、滴答等)。即使只有一个作家,事情仍然可能“同时”发生。
关于cqrs - 重播事件的 NEventStore 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17483273/
我想在 vim 中从光标到缓冲区末尾的打开缓冲区的每一行上运行我刚刚在寄存器“x”中记录的宏。我该怎么做? 我知道我可以重播宏 n 次: 15@x ...或者只需按住 @ 直到到达最后一行,但我只想按
因此,我最近尝试学习html5知识,并获得了音频标签。在PC的浏览器Chrome上似乎可以正常工作,但在Android(4.0,同时使用常规浏览器和海豚)上却不能正常工作。它将播放一次音频,但不会再播
我有兴趣使用 PHP 构建一个解析器来享受我的乐趣。我需要知道什么?你对我有什么建议?我什至如何使用 PHP 打开星际争霸 2 重播? 最佳答案 SC 回放文件实际上是一个 MPQ 存档文件。此 MP
我有一个使用 Animate.CSS 的动画如果用户愿意,我想重播,但我尝试的方法不起作用。这是代码: HTML:
在 ASP.NET MVC 中防止一个有效 cookie 一次被多个客户端使用的“最佳实践”是什么? 在这种情况下,我们使用了所有 OWASP 技巧。 严格的 HSTS:每个页面都使用 HTTPS/S
我有一个 AVPlayer 类,全部设置为流式传输音频文件。它有点长,所以我不能在这里发布整个内容。我坚持的是如何让用户在听完一次音频文件后重播。当它第一次完成时,我正确地收到通知 AVPlayerI
我正在尝试用 sipp 重播捕获的 pcap 文件。我的设置有 2 台电脑和一个代理。接收电脑有 linphone,应该能够接听来自另一台发送带有 sipp 的 pcap 文件的电脑的调用。我已经用
我有一个网页,如果应用了某些样式,滚动时可能会出现卡顿。我的问题是如何系统地测试个人风格的效果。我不想每次都手动向下滚动页面,我想执行一些可复制的操作,以便轻松比较两个不同样式表的效果。是否可以录制和
我想从 Clojurescript 建立一个 Om session ,它可以在另一台机器上回复整个 GUI。我如何才能将原子从客户端传递到服务器,以便只发送更改,以便可以在其他地方重播更改历史? 更新
我一直在使用 React Native Video 模块并且它工作得很好,但是我需要播放结束时的视频自动倒回到开头。视频实例可以选择使用: onEnd={this.onEnd} 视频播放结束后调用一个
我的计算机上有一些虚拟机,它们通过主机专用网络相互通信。 我想模拟这些机器之间的中间人攻击。我发现的所有运行 MITM 的工具都只是监视数据包,但我没有找到任何可以真正重放或更改它们的工具。 我发现了
我是 FreeGLUT 的当前维护者之一sourceforge 上的项目。此代码存储在 SVN 存储库中,但为了激发其他人的贡献,我想提供一个 git 存储库。我已经在 github 上有一个 svn
我正在开发一个有很多命令行交互的系统。有时甚至通过 SSH。命令有时可能需要长达 30 分钟才能完成。 目前,我正在停止对执行该系统调用的对象的大部分 system 调用。例如: class Back
我们如何在delve session 中轻松查看decimal.Decimal值的浮点值。尤其是在 mozilla rr 录制的 dlv replay session 中。 (dlv) args un
我是一名优秀的程序员,十分优秀!