Domain driven design 事件源系统中的预测

Domain driven design 事件源系统中的预测,domain-driven-design,projection,cqrs,event-sourcing,Domain Driven Design,Projection,Cqrs,Event Sourcing,在事件源系统中,我有一个类型为Order的聚合根。让我们假设以下事件是 发生: OrderPlaced(orderId、placedAt、customerId、orderLines),其中OrderLine(lineId、productId、price) OrderAccepted(orderId) 假设我们需要两个不同的投影: 包含每个客户的所有已接受订单(按年份分组)总价的预测。大概是这样的: OrdersByCustomer(customerId,SummationOnAccepted

在事件源系统中,我有一个类型为Order的聚合根。让我们假设以下事件是 发生:

  • OrderPlaced(orderId、placedAt、customerId、orderLines),其中OrderLine(lineId、productId、price)
  • OrderAccepted(orderId)
假设我们需要两个不同的投影:

  • 包含每个客户的所有已接受订单(按年份分组)总价的预测。大概是这样的: OrdersByCustomer(customerId,SummationOnAcceptedOrdersByEAR),其中SummationOnAcceptedOrdersByEAR(年份,总和)

    这里的问题是OrderAccepted不包含customerId。因此,当投影接收到OrderAccepted时,它无法获取当前 投影状态,因为customerId是documentId。值得注意的是,我将投影存储在“锡拉”中,而“锡拉”只能由 分区键-投影状态只是一个json表示。因此,除了documentId/projectionId之外,其他任何东西都无法查询。大概 这不是预测技术的理想选择

    我想如果继续使用“锡拉”,我有两个选择:

    • 使用customerId接受订单。但我觉得这不是一个好方法——那么我需要将其纳入所有活动中 这将与projectionId/documentId与aggregateId不同的投影相关
    • 或者有一个单独的表,其中包含orderId和customerId之间的映射,因此投影可以查询customerId-此表可能需要在命令处理程序中更新 订单的总金额
    • 或者,我们可以为CustomerIdByOrderId创建一个投影-但在这里,我认为投影可以位于事件流的不同位置-这可能 也可能会引起问题
  • 对每种产品的所有已接受订单的价格进行汇总的预测。像这样的 产品汇总(产品ID、订单汇总)

    这里我们有一个投影,它依赖于OrderPlaced和OrderAccepted。问题是,由于OrderPlaced可能包含多个 订单线,从而跨越多个投影-我们需要在接收OrderPlaced时更新多个投影。这种情况正常吗 采购预测-更新多个预测公关活动

    这里出现的问题与OrderAccepted不包括OrderPlaced事件中的ProductID相同。所以在这里,我们可以使用类似的方法来创建一个表,其中包含 orderId和productID


  • 我想知道更有经验的事件源程序如何解决这些问题…?:)对此,我们非常感谢您的任何意见。

    事件源系统的妙处在于,您需要的所有信息都封装在事件中,或者至少应该封装在事件中

    我假设您使用的是CQRS模式,根据您的描述,问题集中在投影应该是什么样子。换句话说,您不应该真正需要更改命令/事件端的任何内容,而是应该关注如何从事件中获取所需的数据,以建立适当的预测

    我对“锡拉”并不熟悉,但你可以自由地建立你的预测,无论哪种方式对你有效。请记住,投影只是可以从事件中查询的数据

    我能想象的最简单的事情就是只存储每个订单,包括状态。类似这样的内容(在可怕的伪代码中):

    注意,上面的代码假定事件是按顺序处理的

    我们需要在接收时更新多个预测 下单了。这在事件来源预测-更新中是否正常 多重预测公关活动


    当然,这很正常。您可以使用单个事件来更新多个投影,也可以使用多个事件来更新单个投影,或者两者的组合。

    谢谢。这在某种程度上是有帮助的:)经过一些研究,我得出结论,我将尝试实现一个叫做Projectionst的东西,它负责播放所有包含的投影。让一个投影质疑另一个投影。这里我唯一能看到的挑战是,Projectionis中的投影必须按正确的顺序投影。我已经看到了一些使用这种方法的例子,所以我希望这是一种不错的方法:)
    -- Order Summary event handler
    on(orderPlaced):
    insert into Order(orderId, datePlaced, customerId, orderLines, status)
    values (orderPlaced.orderId, orderPlaced.date, orderPlaced.customerId, orderLines, 'placed')
    
    on(orderAccepted):
    update Order
    set status = 'accepted'
    where orderId = orderAccepted.orderId
    
    -- Sum of accepted orders per customer and year
    select customerId, year, sum(orderLines.price) from Orders
    where status = 'accepted'
    group by customerId, year(datePlaced)
    
    -- Sum per product of accepted orders
    select productId, sum(orderLines.price) from Orders
    where status = 'accepted'
    group by orderLines.productId, year(datePlaced)