모델을 제어하는 서비스 A (CMS) (제품, ID, 제목, 가격) 및 지정된 모델을 표시해야하는 서비스 B (배송) 및 C (이메일) 필드 만 가정해야합니다. 이벤트 소싱 접근 방식으로 해당 서비스에서 특정 모델 정보를 동기화하는 방법 제품 카탈로그가 거의 변경 되지 않지만 변경 사항은 거의 없으며 배송 및 전자 메일 데이터에 매우 자주 액세스 할 수있는 관리자가 있다고 가정합니다 (예 : 기능 : B : display titles of products the order contained
및 C :) display content of email about shipping that is going to be sent
. 각 서비스에는 자체 DB가 있습니다.
해결책 1
이벤트 내 제품에 대한 모든 필수 정보를 전송하십시오. 이는 다음과 같은 구조를 의미합니다 order_placed
.
{
order_id: [guid],
product: {
id: [guid],
title: 'Foo',
price: 1000
}
}
서비스 B 및 C 제품 정보는 테이블의 product
JSON 속성에 저장됩니다.orders
따라서 필요한 정보를 표시하기 위해 이벤트에서 검색된 데이터 만 사용됩니다
문제점 : B와 C에 제시해야 할 다른 정보에 따라 이벤트시 데이터 양이 늘어날 수 있습니다. B와 C는 제품에 대해 동일한 정보를 요구하지 않을 수 있지만, 이벤트를 둘로 분리하지 않는 한 이벤트에 둘 다 포함해야합니다. 주어진 이벤트에 지정된 데이터가 없으면 코드에서 사용할 수 없습니다 . B 및 C의 기존 주문에 대해 지정된 제품에 색상 옵션을 추가 하면 이벤트를 업데이트 한 다음 다시 실행하지 않으면 주어진 제품이 무색이됩니다. .
해결책 2
이벤트 내에서 제품의 안내 만 전송-이는 다음과 같은 구조를 의미합니다 order_placed
.
{
order_id: [guid],
product_id: [guid]
}
서비스 B 및 C 제품 정보는 테이블의 product_id
속성에 저장됩니다.orders
A/product/[guid]
엔드 포인트에 대한 API 호출을 수행하여 필요할 때 서비스 B 및 C가 제품 정보를 검색 합니다.
문제 : 이것은 B와 C를 A에 항상 의존하게 만듭니다 (항상). 제품 스키마가 A에서 변경되면 해당 제품에 의존하는 모든 서비스에 대해 변경을 수행해야합니다 (갑자기)
해결책 3
이벤트 내에서 제품의 안내 만 발송-order_placed에 대한 다음 구조를 의미합니다.
{
order_id: [guid],
product_id: [guid]
}
서비스 B 및 C 제품 정보는 products
테이블에 저장됩니다 . 아직 거기 product_id
에 orders
테이블 만 복제 거기에 products
A, B와 C 사이의 데이터; B와 C는 A와는 다른 제품 정보를 포함 할 수 있습니다
제품 정보는 서비스 B 및 C가 작성 될 때 시드되며 A/product
엔드 포인트 를 호출 하거나 (모든 제품의 필수 정보를 표시 함) A에 대한 직접 DB 액세스를 수행하고 제공된 필수 제품 정보를 복사하여 제품에 대한 정보가 변경 될 때마다 업데이트 됩니다. 서비스.
문제점 : 이것은 B와 C를 A에 의존하게 만듭니다 (씨앗 때). 제품 스키마가 A에서 변경되는 경우 제품에 의존하는 모든 서비스 (시딩시)에서 변경을 수행해야합니다.
내 이해에서 올바른 접근법은 솔루션 1을 사용하고 특정 논리마다 이벤트 기록을 업데이트하는 것입니다 (제품 카탈로그가 변경되지 않고 표시 할 색상을 추가하려는 경우 기록을 안전하게 업데이트하여 현재 상태를 얻을 수 있음) 제품 카탈로그 및 이벤트 내에서 누락 된 데이터 채우기) 또는 지정된 데이터가 존재하지 않음 (제품 카탈로그가 변경되어 표시 할 색상을 추가하려는 경우 해당 시점에서 과거에 제공된 제품이 있는지 확실하지 않음) 색상이 있었는지 여부-이전 카탈로그의 모든 제품이 검은 색이며 이벤트 또는 코드를 업데이트하여 제공한다고 가정 할 수 있습니다)
updating event history
의미 : 모든 이벤트를 통해 한 스트림 (v1)에서 다른 스트림 (v2)으로 복사하여 일관된 이벤트 스키마를 유지하십시오.
display image at the point when purchase was made
) 또는 (의 의도를 나타내는 수 없습니다 display current image as it within catalog
)
updating event history
-이벤트 소싱 이벤트 기록은 진실의 원천이며 절대 변경해서는 안되며 앞으로 나아갑니다. 이벤트가 변경되면 이벤트 버전 관리 또는 유사한 솔루션을 사용할 수 있지만 특정 시점까지 이벤트를 재생할 때 데이터 상태는 해당 시점의 상태 여야합니다.