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

약간의 실수는 있지만 벌크 업데이트는 좋은 생각인가?

제품은 인벤토리를 관리하는 경우 높은 경쟁률이 집계 된 제품입니다. Amazon.com에 동시에 수백 명의 사람들이 같은 제품에 대한 주문을하는 것을 상상해보십시오. 반면에 거의 동시에 주문을 수정할 사람은 거의 없을 것입니다.

예를 들어 보자 Event3와

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

합니다 Event1 충돌, Event3

와 Event2 충돌 더 많은 제품을 사용하면 하나의 트랜잭션 내에서 업데이트를 동시성 실패의 큰 기회가 귀하의 제품이 잘 판매하는 경우 .

트랜잭션 당 하나의 제품을 반복하면 이벤트가 다시 시도하기 어려워집니다.

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 (IDs ...)와 함께 뭔가 잘못되었다는 것을 알고 있었다. –

+1

@ woof-woof 나는 일괄적인 업데이트가 어떤 상황에서는 여전히 유용하다고 믿는다. 그것은 당신의 도메인에 의존한다. 나는 serveral 년간 예약 프로젝트에 종사하고, 우리는 하나의 거래로 주문과 상품을 갱신한다. 대부분의 주문은 B2B 마케팅 채널 (영업 사무소, 대행사)에서 이루어지며 그 결과는 그리 높지 않기 때문에 잘 작동합니다. – Hippoom

관련 문제