findOrder()
findOrder()는 단순히 기본키로 EQUI 조인 작업GET /orders/{orderId}GET /tickets?orderId={orderId}GET /deliveries?orderId={orderId}GET /charges?orderId={orderId}Order를 조회하고, 다른 서비스는 orderId를 외래키로 자신의 애그리거트를 조회하는 것CompletableFuture, RxJava의 옵저버블 등CANCELLED이지만 주문의 티켓은 아직 취소되지 않았을 수도 있다.findOrderHistory()는 다음 매개변수를 통해 주문 이력을 조회한다.
consumerIdOrderHistoryFilter (시간, 상태, 음식점 및 메뉴 항목을 검색할 키워드 등)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가 각각 호출한다.