【问题标题】:Repository and bulk update - avoiding database roundtrips存储库和批量更新 - 避免数据库往返
【发布时间】:2013-08-07 21:23:42
【问题描述】:

我在批发系统领域工作。部分商品发货时,会触发域名NewProductsDeliveredEvent。事件包含一组包含产品代码和数量的ProductDelivery 值对象。如下所示:

class NewProductsDeliveredEvent {
  Set<ProductDelivery> productDeliveries;
}

class ProductDelivery { 
  ProductCode productCode;
  Quantity quantity
}

到目前为止一切顺利。现在,当负责库存更新的组件收到此类事件时。它必须使用当前可用产品数量更新产品表。所以我有类似的东西:

class NewProudctsDeliveredHandler {
  ProductRepository productRepo;  

  handle(NewProductDeliveryEvent event) {
    for (ProductDelivery delivery : event.getProductDeliveries()) {
      Product product = productRepo.getByCode(delivery.getProductCode())
      product.updateQuantity(delivery.getQuantity());
    }
  }
}

很容易发现这样的逻辑会产生大量的数据库往返,我正在考虑一些解决方案来减轻痛苦。一种想法可能是使用Specification 模式并为产品代码构建 OR 规范。但是,在我的应用程序中,产品代码是一个业务标识符,所以这个解决方案有点味道(也许我只是在夸大其词)。

有没有更好的处理方法?任何想法都非常感谢。

【问题讨论】:

  • 为什么不只是 productRepo.getByCodes(...)?
  • 因为我从未见过使用这种方法的存储库,对我来说这似乎是一些设计缺陷(但可以肯定,这将是最简单的解决方案;))
  • 什么是“product.updateQuantity(delivery.getQuantity());”做?更新库存?
  • @Hippoom Product 持有它的可用数量,所以 updateQuantity 实际上会减少它(我知道,方法应该有一个更好的名称)

标签: domain-driven-design repository-pattern ddd-repositories


【解决方案1】:

如果您允许稍微题外话,但您确定批量更新对您来说是个好主意吗?

如果产品管理库存,它就是高竞争的集合。试想一下,可能有数百人同时在 Amazon.com 上为同一产品下订单,而很少有人会同时修改您的订单。

举个例子:

事件1:A-5,B-1 事件2:C-1,D-2 事件 3:A-2,D-3

Event1与Event3冲突,Event2与Event3冲突

您在一次交易中更新的产品越多,如果您的产品卖得好,并发失败的可能性就越大。

每次交易迭代一个产品更糟糕,使事件更难重试。

handle(NewProductDeliveryEvent event) {
    for (ProductDelivery delivery : event.getProductDeliveries()) {
        updateProductTransactionally(); 
        // How to retry the whole event 
        // when the second one failed and the first one committed?
    }
}

也许将事件拆分为仅触发一个产品更新的多个子事件更合适。

【讨论】:

  • 非常好!非常感谢,我刚刚忽略了这方面。我知道 repo.getById(IDs...) 有问题:)
  • @woof-woof 我相信批量更新在某些情况下仍然有用,这取决于您的域。我在一个预订项目上工作了几年,我们在一次交易中更新订单和产品。效果很好,因为大部分订单来自b2b营销渠道(售楼处、代理商),吞吐量不是很高。
猜你喜欢
  • 2012-07-20
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多