- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在开发一个 DDD 地理定位应用程序,它在一个有界上下文中有两个独立的聚合根。由于坐标更新频繁,我使用 Redis 来保存不允许回滚的数据。
发送坐标更新时,我将生成并触发“UpdateUserPostionEvent”。作为副作用,我还会在特定点生成并触发“UpdateTripEvent”,这将更新司机/乘客的坐标。
我的问题是,如果我异步触发“UpdateLiveTripEvent”,我该如何处理最终一致性。我的 UpdateLiveTripEventHandler 有几个故障点,除了记录错误外,我该如何处理这种不一致?
我正在使用一个名为 MediatR 的库据我所知,INotificationHandler 是“即发即弃”
编辑: 最终找到了这个 SO post准确描述了我需要的东西(saga/process manager),但不幸的是我无法在同一个 BC 中找到任何类型的 Saga 实现来处理事件。我看到的所有示例都涉及服务总线。
最佳答案
相同或不同的限界上下文;有或没有传奇;没关系。
为什么事件处理失败?领域规则或基础设施。
域规则:由聚合处理的引发事件(事件处理程序使用聚合来应用事件)不应因域规则而失败。
如果“目标”聚合具有拒绝事件的域规则,则您的聚合设计是错误的。命令/操作可以被域规则拒绝。域规则不能拒绝(或撤消)事件。
当“来源”聚合检查了此操作的所有域规则时,应引发一个事件。 “目标”聚合应用事件并可能引发另一个事件,其中包含由“目标”聚合计算的某些值(域规则,但不是用于拒绝事件;域规则不能拒绝事件;但要“继续”一致性“链"具有良好的责任分离)。这就是为什么事件应该以过去的句子作为名称的原因;因为已经发生了。
事件模拟:
基础设施:修复它并应用事件。 ;) 一旦您的持久性引擎、网络和/或机器再次启动,甚至可以在需要时“手动”。
短时间自动重试失败。错误队列/日志不会在长时间中断时丢失您的事件(并在以后应用)。
事件溯源也有助于此,因为您始终可以在“目标”聚合中重新应用持久化事件,而无需额外努力将事件保存在某个地方(即事件日志),因为您的域持久化也是您的事件存储。
关于events - DDD 使用 NoSQL 处理限界上下文中多个聚合的最终一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51773949/
GhostScript PDF/A 生成好像有错误 当您通过 GhostScript 生成 PDF/A 文档时,当您单击 Adobe Reader 时,会出现一个一致性选项卡,其中显示: “一致性
我有一个需要测试的 XPath 引擎实现。 是否有一组标准的一致性测试可以用来验证是否符合 XPath 规范(与 XSLT 相关)。 什么将是完美的 XML 文档 XPath 表达式和预期的结果。 最
帮助我了解在这种情况下我可以期望与 MongoDB 的一致性级别。 我们正在运行一个副本集,其中 Mongoid 中的 consistency 标志设置为 strong,这意味着只读到 master。
假设我有一个采用一个参数的方法。 此参数应满足以下要求: 'of type':方法需要知道参数属于特定类(或子类)。 'implements interface':方法需要知道参数实现了特定的接口(i
当协议(protocol)将属性声明为可选而具体类型将其声明为非可选时,如何使具体类型符合协议(protocol)? 这是问题所在: protocol Track { var trackNum
我正在考虑使用浏览器的 navigator.mimeTypes 数组作为第三级用户/浏览器标识符。例如,当我在 Chrome 上运行时... console.log(navigator.mimeTyp
我有以下协议(protocol): protocol ProtoAInput { func funcA() } protocol ProtoA { var input: ProtoAI
如果选择“最终”一致性,则发生写入的区域内的一致性是什么? 如果我只需要区域强一致性,应该选择哪个选项? 最佳答案 如果您需要在主要区域内进行强读取,则应该选择强一致性或有界过时一致性。 关于azur
您好,我是一名初学者,目前正在尝试学习 java 编程。课本上的问题: 编写一个程序来帮助人们决定是否购买混合动力汽车。你的程序的输入应该是:•新车的成本•预计每年行驶里程•预计汽油价格 •每加仑英里
我正在尝试制作一个可以在 UILabel 上使用的 Swift 协议(protocol), UITextField , 和 UITextView包含他们的text , attributedText ,
我有一个类扩展: extension UICollectionViewCell { class func registerFromNibInCollectionView(collectionV
为了在 Swift 中模拟对象进行测试,我通常遵循这样的模式:编写一个协议(protocol)来描述我想要的对象的行为,然后使用 Cuckoo 为其生成模拟以进行测试。 通常,这些协议(protoco
假设我有两个非通用协议(protocol)(1) protocol StringValue { var asString: String {get} } protocol StringProv
我有一组协议(protocol)可以在 UITableView 中显示一个元素: protocol TableRepresentableRow { var title: String { get
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
用“class”标记 CacheManager 解决了我的问题。 案例:一个简单的缓存器,mutating get 不是我想要的,那么对于引用类型或类类型应该怎么做? protocol Cacher
我想要一个符合协议(protocol)的变量,但是 swift 编译器告诉我协议(protocol)没有确认。 protocol A {} protocol B { var a : A { g
如果我有一个类 Christmas 和一个协议(protocol) Merry,要使 Christmas 符合 Merry,很多人会这样做: class Christmas { ... } e
@objc public protocol P1 { func p1foo() } @objc public protocol P2 { func p2foo() } class A: NSO
我有一些结构符合的基本协议(protocol)(模型)。它们也符合 Hashable protocol Model {} struct Contact: Model, Hashable { v
我是一名优秀的程序员,十分优秀!