1

我在批发系统领域工作。当一些产品交付时,域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 规范。但是,在我的应用程序中,产品代码是一个业务标识符,所以这个解决方案有点味道(也许我只是在夸大其词)。

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

4

1 回答 1

3

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

如果产品管理库存,它就是高竞争的集合。试想一下,可能有数百人同时在 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?
    }
}

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

于 2013-08-07T12:48:09.547 回答