当前位置: 首页 > 知识库问答 >
问题:

CQRS/事件源/事件总线/定时

龙飞文
2023-03-14

我在CQRS/ES设计中有一个计时案例。为了便于讨论,让我们以Microsoft关于这个主题的示例会议管理为基础(https://msdn.microsoft.com/en-us/library/jj554200.aspx)。

  • 假设在第1分钟创建会议(最大座位数为20)。
  • 在第4分钟,事件到达order mgmt上下文,因此创建了一个座位可用性。
  • 在第7分钟,用户下了一个订单(通过订单管理),购买了整个20个座位。(这也应该从订单管理传达到conf管理,以便conf管理人员能够做出正确的决定)。
  • 在第8分钟,conf admin更改了座位可用性(在conf mgmt上下文中),将其减少到15.
  • 订单管理部门的通知(关于所有20个座位都已售出的事实)在第9分钟到达。
  • 现在怎么办?(在conf MGMT?当你已经收到20个座位的付款时,你不应该把座位减少到15个;但在第8分钟,管理员不知道这件事)。

那是第一个案子。

现在第二种情况:

    null

添加注意:或者可能…,在订单管理上下文中,我们可以简单地对购买座位的命令进行排队,直到我们知道已经从会议管理上下文中收到了最新/最后的事件。我是说,事件都有时间戳,对吧?因此,我们可以将从conf mgmt上下文接收的最后一个事件的时间戳与座位购买命令的时间戳进行比较。如果最后一个事件的ts小于命令的ts,我们只是推迟命令的执行,直到我们收到一个ts大于命令ts的事件。这类事情将由流程经理(saga)负责。

那样行吗?是正确的做法吗?

添加注意:相关线程>在CQRS http应用程序中实现SAGA/Process Manager。我想我们和流程经理的关系是对的。正如回答者所说:“你根本不会立即回答‘订单确认’。看看亚马逊和其他购物网站是如何做到的:在提交订单时,你只会收到一个”订单接受确认(例如,HTTP代码202接受)“。

谢谢,拉卡

共有1个答案

松高歌
2023-03-14

三种可能

首先,你接受最终的一致性。正如评论中所指出的,在许多最终的一致性场景中,如果及时意识到问题,业务将有一种方法来缓解问题--因此,您需要一些东西来监视从模型中出来的事件,注意到预订的座位数和售出的座位数之间存在差异,也许还需要一个基于任务的UI来允许人类做正确的事情[tm]。

其次,检查业务,看看您是否真正正确地建模了真实的业务流程。例如,你可能在购买座位时错过了几个阶段;订单管理可能需要在确认订单前预订座位。

这是假设会议管理部门应保持一个不变量,即保留的席位数目少于分配的席位数目。在你的生意中,这可能不是真的。此外,能够跟踪客户试图预订超过可用座位的次数,这对业务可能是有用的。

第三,可能是你的服务边界划错了地方。乌迪·达汗写道

任何数据或规则必须仅由一个服务拥有。

如果会议管理中的席位和顺序管理中的席位是一回事,那么它们可能属于一起(相同的服务边界)。

我的建议是,基于自动化应该能够在需要时避开领域专家的原则,您应该主要考虑第一种方法--您是否能够将问题浮出水面并将其控制权移交给业务专家。如果你做对了这一点,你很可能会有一个成功的项目。

 类似资料:
  • 让我们跳进 API 获取事件总线 你获取到事件总线的引用,如下所示: EventBus eb = vertx.eventBus(); 还有每个 Vert.x 实例事件总线的单个实例。 注册处理程序 这个最简单的方法来注册一个处理程序用consumer。下面是一个示例: EventBus eb = vertx.eventBus(); eb.consumer("news.uk.sport", mess

  • 注:本节未经校验,如有问题欢迎提issue 最初设想是为了提供一种向多个actor群发消息的方法,之后EventBus被一般化为一组实现一个简单接口的可组合的特质: /** * Attempts to register the subscriber to the specified Classifier * @return true if successful and false if not

  • 很明显,基于这些模式的系统是易于扩展的。但我想问你,具体怎么做?关于可伸缩性,我没有什么问题: 如何缩放聚合体?如果我将创建

  • 我想创建一个CQRS和事件源架构,非常便宜,非常灵活,非常简单。 我想确保事件永远不会失败,至少到达发布者/事件存储,永远,因为这是业务所在。 天蓝 有了azure,我似乎不知道该用什么。 Azure服务总线 蔚蓝函数 Azure webjob(我想这可以用Azure函数代替) ??(还有什么我忘了或者不知道的?) null 你的经验说明了什么? 其他替代方案呢?(例如:)?

  • 背景 JDK中通过Observer接口和Observable类实现观察者模式, Observer对象是观察者,Observable对象是被观察者. 实现一个简单的观察者模式有以下几步: 创建被观察者, 继承自java.util.Observable类 创建观察者, 实现java.util.Observer接口 在观察者中实现void update(java.util.Observable obse

  • 我有一个在AWS Lambda上运行的基于微服务的应用程序。其中两个微服务,最关键的,使用事件源/cqrs。 背景:(这也是我整理思想的地方) 我正在使用这个库并将事件存储在DynamoDB中,并将预测存储在AWS S3中。 写入部分的工作方式很有魅力:每个命令调用都从DynamoDB加载聚合的当前状态(通过处理程序运行事件和/或加载缓存的聚合),它根据一些业务逻辑决定接受或拒绝命令,然后使用键条