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往返的,我想一些解決方案,以減輕疼痛。一個想法可能是使用Specification模式併爲產品代碼構建OR規範。然而,在我的應用程序中,產品代碼是商業標識符,所以這個解決方案有點味道(也許我只是誇大其詞)。

有沒有更好的方法來處理它?任何想法不勝感激。

+1

爲什麼不只是productRepo.getByCodes(...)? – gseric

+0

,因爲我從來沒有見過這樣的方法和對我來說似乎是一些設計缺陷(但當然,這將是最簡單的解決方案;)) –

+0

什麼是「product.updateQuantity(delivery.getQuantity());」做?更新庫存? – Hippoom

回答

3

如果您允許輕微的離題,但是您確定批量更新對您的情況是一個好主意嗎?

如果管理庫存,則產品是高度競爭的集合。試想一下,可能有數百人在亞馬遜網站上同時發佈同一產品的訂單,而很少有人會同時修改您的訂單。

拿一個例子:

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

事件1衝突與EVENT3,與EVENT3

事件2衝突越多的產品,你在一個事務中更新,併發故障的機率也就越大,如果你的產品很暢銷。

迭代每個事務的一個產品更糟,使事件更難以重試。

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

可能會將事件拆分爲多個子事件,只觸發一個產品更新會更合適。

+0

非常好的一點!非常感謝,我剛剛忽略了這方面。我知道repo.getById(ID ...)有問題:) –

+1

@ woof-woof我相信在某些情況下批量更新仍然是用戶化的,這取決於您的域。我多年來一直在訂購項目,我們在一次交易中更新訂單和產品。它運作良好,因爲大部分訂單來自B2B營銷渠道(銷售辦事處,代理商),吞吐量不是很高。 – Hippoom