좀 더 많은 연구를 한 후에, 나는 이 기사를 우연히 발견했습니다. 이 기사에서 내가 성취하고 싶은 것과 미래의 독자들에게 도움이된다고 생각합니다. 이것은 명령형 프로그래밍 모델보다 반응 형 프로그래밍 모델을 채택하는 방법을 제공합니다.
이벤트 소싱
여기서의 아이디어는 모든 응용 프로그램의 상태 전이를 불변 이벤트 형태로 나타내는 것입니다. 그런 다음 이벤트는 발생시 로그 또는 저널 형식으로 저장됩니다 ( '이벤트 저장소'라고도 함). 또한 시간이 지남에 따라 애플리케이션의 상태가 전체적으로 어떻게 진화했는지를 나타 내기 위해 무기한으로 쿼리 및 저장 될 수 있습니다.
이것이 달성하는 데 도움이되는 것은 마이크로 서비스가 중단되었지만 이와 관련된 다른 이벤트가 게시 되고 해당 마이크로 서비스의 다른 인스턴스가 이벤트를 소비하는 경우 해당 마이크로 서비스가 다시 시작되면이를 참조하여 event store
모든 서비스를 검색 할 수 있다는 것입니다. 다운 된 기간 동안 놓친 이벤트.
이벤트 브로커로서의 Apache Kafka
초당 수천 개의 이벤트를 저장하고 발송할 수 있고 내장 된 복제 및 내결함성 메커니즘이있는 Apache Kafka의 사용을 고려하십시오. 그것은 디스크에 무기한으로 저장 될 수 있고 토픽 (카프카의 멋진 대기열)이 전달 될 때마다 (제거되지는 않지만) 소비 될 수있는 영구적 인 이벤트 저장소를 가지고 있습니다.
이벤트는 주제 내에서이를 식별 할 수있는 오프셋을 지정합니다. Kafka는 오프셋 자체를 관리하여 "최대 한 번"또는 "적어도 한 번"전달 의미를 쉽게 제공 할 수 있지만 이벤트 소비자가 토픽에 참여할 때 협상 할 수도 있습니다. 마이크로 서비스가 임의의 특정 시점 (일반적으로 소비자가 중단 한 장소)에서 이벤트 이용을 시작할 수 있습니다. 유스 케이스가 '성공적으로 완료'될 때 마지막으로 소비 된 이벤트 오프셋이 서비스의 로컬 스토리지에서 트랜잭션으로 지속되는 경우 해당 오프셋을 사용하여 "정확히 한 번"이벤트 전달 시맨틱을 달성 할 수 있습니다.
실제로 소비자가 Kafka에 자신을 식별하면 Kafka는 어떤 메시지가 어떤 소비자에게 전달되었는지 다시 기록하지 않도록 기록합니다.
사 가스
서로 다른 서비스 간의 통신이 실제로 필요한보다 복잡한 유스 케이스의 경우 유스 케이스 완료의 책임을 잘 인식해야합니다. 유스 케이스는 분산되어 있으며 관련된 모든 서비스가 해당 태스크를 성공적으로 완료 한 것으로 확인하면 완료됩니다. 그렇지 않으면 전체 유스 케이스가 실패해야합니다 잘못된 로컬 상태를 롤백하려면 수정 조치를 트리거해야합니다.
이것은 사가가 시작될 때입니다. saga는 일련의 로컬 트랜잭션입니다. 각 로컬 트랜잭션은 데이터베이스를 업데이트하고 메시지 또는 이벤트를 게시하여 saga에서 다음 로컬 트랜잭션을 트리거합니다. 로컬 트랜잭션이 비즈니스 규칙을 위반하여 로컬 트랜잭션이 실패하면 saga는 이전 로컬 트랜잭션에서 작성된 변경 사항을 취소하는 일련의 보상 트랜잭션을 실행합니다. 더 많은 정보를 원하시면 이것을 읽으십시오 .