AWS 람다에서 실행되는 마이크로 서비스 기반 응용 프로그램이 있습니다. 가장 중요한 두 가지 마이크로 서비스는 이벤트 소싱/cqrs를 사용합니다.이벤트 소싱/CQRS 모델 읽기 -
배경 : (내 생각을 정리하는이 또한)
나는 this library를 사용하여 AWS S3에서 DynamoDB의 이벤트 및 전망을 저장하고있다.
쓰기 부분은 매력처럼 작동합니다. 각 명령 호출은 (핸들러를 통해 이벤트를 실행하거나 캐싱 된 집계를로드하여) DynamoDB에서 집계의 현재 상태를로드하고 다음 명령에 따라 명령을 수락하거나 거부합니다. 그런 다음 비즈니스 로직을 적용한 다음 KeyConditionExpression: 'aggregateId = :a AND version >= :v'
으로 DynamoDB에 기록합니다. 여기서 버전은 해당 집계에 대해 처리 된 이벤트의 수입니다. 충돌이 있으면 쓰기가 실패합니다. 나에게 좋은 시스템 같아!
각 이벤트는 SNS (주제 이름은 서비스 이름)로 브로드 캐스팅되므로 원하는 경우 다른 서비스가 이벤트에 반응 할 수 있습니다.
내가 정말로 고민하는 부분은 읽음입니다. 프로젝션은 S3에 저장되고 각 이벤트 소스에 대해 처리 된 마지막 commitId로 태그가 지정됩니다. 읽기 쿼리가 들어 오면 S3 (전체 집계의 경우)의 전체 투영 된 상태를로드하고 모든 최신 이벤트를 이벤트 소스에 쿼리하고 모든 집계에 대해 최신 상태를 계산하고 업데이트 된 개체를 S3에 씁니다 새로운 경우) 쿼리 매개 변수를 기반으로하여 상태의 관련 부분을 반환합니다.
내 문제 (또는 그들 중 하나)
나는 내가 잘못 예측을하고 있어요 생각합니다.
대부분의 내 계획에는 중요한 특성에 따라 ID 만 그룹화되므로 파일은 상대적으로 작게 유지됩니다. 그러나 개별 집계를 검색 할 방법이 필요합니다. 투영을 사용하면 미묘한 것처럼 보입니다. 매번 전체 상태 (예 : 모든 예상 집계)를로드해야하므로 새 이벤트가 적용되고 원하는 레코드를 검색합니다 (변경되지 않았을 수도 있음).
이것은 내가 지금하고있는 것으로, 성능이 뛰어나다. (< 100k 레코드)하지만 훨씬 더 오래 지속될 것이라고 상상할 수 없다.
다른 문제는 쿼리입니다. 내가 쿼리 할 필요가있는 모든 속성에 대해 aggregateIds를 일치시키기 위해 프로젝션 매핑 값을 만들어야합니다 !! 더 좋은 방법이 있어야합니다!
이 문제에 대해 어떤 생각을하든 프로젝션은 변경되지 않은 단일 레코드를 반환하기 전에 항상 전체 현재 상태 + 새 이벤트가 필요합니다.
답장을 보내 주셔서 감사합니다. 따라서 올바르게 이해한다면 쿼리가 생성 될 때 집계가 아닌 이벤트가 들어올 때 프로젝션 업데이트를 트리거해야합니다. 이렇게하면 모든 쿼리에서 이벤트 저장소에 대한 새 이벤트를 쿼리하지 않아도되지만 프로젝션을 업데이트 할 때와 단일 집계를로드 할 때 전체 상태를로드해야합니다. 권리? 또는 나는 무엇인가 놓쳤다. – joshblour