findOrder()
findOrder()
는 단순히 기본키로 EQUI 조인 작업GET /orders/{orderId}
GET /tickets?orderId={orderId}
GET /deliveries?orderId={orderId}
GET /charges?orderId={orderId}
Order
를 조회하고, 다른 서비스는 orderId
를 외래키로 자신의 애그리거트를 조회하는 것CompletableFuture
, RxJava의 옵저버블 등CANCELLED
이지만 주문의 티켓은 아직 취소되지 않았을 수도 있다.findOrderHistory()
는 다음 매개변수를 통해 주문 이력을 조회한다.
consumerId
OrderHistoryFilter
(시간, 상태, 음식점 및 메뉴 항목을 검색할 키워드 등)findAvailableRestaurants()
PRCESSED_EVENTS
라는 별도 테이블에 이벤트 ID를 삽입할 수 있다.findOrderHistory
와 findOrder
가 구현된 CQRS 뷰에는 다음의 모듈이 존재한다.
OrderHistoryEventHandler
: 여러 서비스가 발행한 이벤트를 구독하며 OrderHistoryDAO
를 호출OrderHistoryQuery
API 모듈: REST API 엔드포인트 구현OrderHistoryDataAccess
: DynamoDB 테이블 관련 헬퍼 클래스를 조회/수정하는 메서드가 정의된 OrderHistoryDAO
를 포함ftgo-order-history
: 주문이 저장된 DynamoDB 테이블public class OrderHistoryEventHandlers {
private OrderHistoryDao orderHistoryDao;
// ...
public void handleOrderCreated(DomainEventEnvelop<OrderCreated> dee) {
orderHistoryDao.addOrder(makeOrder(dee.getAggregateId(), dee.getEvent()),
makeSourceEvent(dee));
}
// ...
public void handleDeliveryPickedUp(DomainEventEnvelop<DeliveryPickedIp> dee) {
orderHistoryDao.notePickedUp(dee.getEvent().getOrderId(),
makeSourceEvent(dee));
}
// ...
}
makeSourceEvent()
는 애그리거트 타입과 ID, 그리고 이벤트 ID가 포함된 SourceEvent
를 생성한다.
SourceEvent
를 이용하여 멱등성을 보장한다.ftgo-order-history
테이블의 설계
ftgo-order-history
의 아이템 하나로 저장할 수 있다.orderId | consumerId | orderCreatedTime | status | lineItems |
---|---|---|---|---|
… | xyz-abc | 229392823232 | CREATED | [{…}, {…}, …] |
findOrderHistory
쿼리 전용 인덱스 정의
query()
작업은 파티션 키와 정렬 키의 쌍을 기본키로 사용하여 알맞은 결과를 반환할 수 있다.
consumerId
, orderCreationDate
)는 유일한 값이 아니기에 기본키로는 적합하지 않다.consumerId
, orderCreationDate
) 쿼리할 수 있다.orderId
, status
)를 가질 수 있다.findOrderHistory
쿼리 구현
query()
작업은 정렬 키에 범위 제약을 걸 수 있는 조건 표현식을 지원하기에 쉽게 구현 가능하다.pageSize
매개변수로 지정한다.PutItem()
UpdateItem()
을 이용하는 것이 더 간단하다.UpdateItem()
Order
아이템 속성을 과거 값으로 세팅할 가능성이 존재한다.OrderHistoryDaoDynamoDb
는 아이템마다 이벤트를 일일이 기록해 중복 이벤트를 감지한다.OrderHistoryDaoDynamoDb
는 <애그리거트 타입=""><애그리거트 ID=""> 속성으로 애그리거트 별 이벤트를 추적 가능하다.애그리거트>애그리거트>attribute_not_exists(<애그리거트 타입><애그리거트 ID>
또는 <애그리거트 타입><애그리거트 ID> < :이벤트 ID
ftgo-order-history
테이블의 아이템을 읽고 쓰는 메서드가 구현된 클래스OrderHistoryEventHandler
가, 쿼리 메서드는 OrderHistoryQuery
API가 각각 호출한다.