Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • 비교적 심플한 코드작성으로 CRUD 테스트 수행이 완료되었습니다.

...


CQRS로의 여정

CRUD만 이용하려고 RavenDB를 선택한것은 아니고~ Akka.net의 Persist기능과 연동되어 

이벤트 소싱을 액터모델의 Persitent 기능과 함께 심플하게 이용할수 있기때문입니다.

Image AddedActorModel에 Persist는 CRUD만 파악되면 커스텀하게 디벨롭할수도 있겠지만, akka.net진영과 콜라보로 공식 지원을 합니다.


RavenDB가 Akka.net의 Persitence 기능을 지원하며 이 코드를 이해하기전 이벤트 소싱패턴을 액터모델을 함께 이용했을때 특징을 먼저 살펴보고 작동가능한 구현된 샘플코드도 유닛테스트를 통해 살펴보겠습니다.


Akka.NET의 액터모델은 CQRS (Command Query Responsibility Segregation)이벤트 소싱 (Event Sourcing) 패턴을 구현하기에 매우 적합한 구조를 제공합니다. 특히 Akka.Persistence 모듈과의 연계를 통해 상태 저장과 복구, 그리고 이벤트 기반 모델링이 가능해집니다. 아래에 그 기능과 장점을 정리해드립니다.

...

✅ Akka.NET 액터모델 + Akka.Persistence 를 활용한 CQRS + 이벤트 소싱

1. 핵심 구성요소


구성요소설명
PersistentActor이벤트를 저장하고 재생할 수 있는 상태 유지 액터
Snapshotting빠른 복구를 위해 특정 시점의 상태를 저장
Event Journal모든 상태 변화(event)를 append-only 로그로 저장
Read Model Actor쿼리에 최적화된 projection을 담당
Command Handler Actor명령(Command)을 받아 이벤트로 전환 및 persistence 수행


2. CQRS(이벤트 소싱) 다이어그램

Image Added

  • 이벤트가 발생할때 즉각 CRUD하여 이용하는 패턴이 아닌 액터모델의 메일박스를 이용해 상태있는 프로그래밍을 통해 이벤트소싱을 설계할수 있으며~ 이러한 느낌


3. 장점 요약

✅ 액터모델 기반의 장점

  • 상태 격리: 각 액터는 고유 상태를 가지며 병렬 처리에 유리함.

  • 비동기 메시지 기반 처리: 병목 없이 고성능 분산 처리 가능.

  • 자연스러운 도메인 분리: 액터 자체가 DDD의 Aggregate Root 역할을 하기에 적합.

✅ CQRS & Event Sourcing의 장점

  • 이벤트 이력 관리: 모든 상태 변화가 이벤트로 저장되므로 과거 상태 추적 가능 (감사, 재처리).

  • 읽기/쓰기 분리: 쿼리와 명령이 분리되어 성능 최적화 가능.

  • 스냅샷 사용 가능: 복구 속도 향상.

  • 스케일 아웃 용이: 각 액터가 독립적으로 배포/스케일링 가능.

✅ Akka.NET 전용의 추가 장점

  • Akka.Cluster와 연계 시 분산 시스템 구성도 가능

  • Akka.Remote로 마이크로서비스 간 통신에도 활용 가능

  • Pluggable Journal Backend: SQL, NoSQL, 이벤트 스토어 등 다양한 저장소와 연동 가능

...

✨ 실사용 시나리오 예

  • 고객 주문 시스템: OrderActorPlaceOrderCommand를 받고 OrderPlacedEvent를 생성 및 저장

  • 챗봇 세션 관리: SessionActor가 메시지를 이벤트로 저장하여 상태 기반 대화 흐름 관리

  • 금융 거래 기록: AccountActorWithdrawn, Deposited 이벤트를 기록하여 완전한 거래 이력 확보





NetCoreLabs 샘플코드

여기서 실험된 작동기능은 다음 저장소에서 실행및 수행가능하며 Akka.net 기반의 액터모델을 중심으로한 다양한 기능들을 확인할수 있습니다.