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());
    }
  }
}

このようなロジックが多くの DB ラウンドトリップを生成することは簡単にわかります。私は、この問題を軽減するための解決策を考えています。1 つのアイデアはSpecification、製品コードのパターンとビルド OR 仕様を使用することです。ただし、私のアプリケーションの製品コードはビジネス ID であるため、このソリューションには少し臭いがあります (誇張しているだけかもしれません)。

それを処理するためのより良い方法はありますか?どんなアイデアでも大歓迎です。

4

1 に答える 1

3

少し余談になりますが、あなたのケースでは一括更新が良い考えであると確信していますか?

商品は在庫管理をすれば高競争率の集合体です。Amazon.com で何百人もの人々が同じ商品を同時に注文しているのに、同時に注文を変更する人はほとんどいないと想像してみてください。

例を見てみましょう:

   Event1: A-5、B-1
   Event2: C-1、D-2
   Event3: A-2、D-3

Event1 は Event3 と競合し、Event2 は Event3 と競合します。

1 回のトランザクションで更新する製品が多いほど、製品の売れ行きが良い場合に同時実行エラーが発生する可能性が高くなります。

トランザクションごとに 1 つの製品を繰り返すのはさらに悪いことであり、イベントの再試行が難しくなります。

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?
    }
}

おそらく、イベントを複数のサブイベントに分割して、1 つの製品更新のみをトリガーする方が適切です。

于 2013-08-07T12:48:09.547 に答える