Versions Compared

Key

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

...

  • 액터를 통한 상태프로그래밍에 의해 HelloCount 가 동기화가 되었기때문에~ Redis를 별도로 호출할 필요없이 이미 알고 있는 상태를 반환합니다.



Redis와 Kafka 유실없음 확인




상태있는 서비스는 기본적으로 CQRS기법을 사용하며, 상태없는 서비스여도 CQRS기법을 사용할수 있습니다. 이둘의 컨셉은 각각입니다.

CQRS

CQRS는 **쓰기(Command)**와 **읽기(Query)**를 서로 분리하여 독립적으로 설계 및 구현하는 패턴입니다.

장점

  1. 성능 최적화:

    • 읽기/쓰기 작업이 분리되므로, 각 작업에 특화된 데이터 저장소나 데이터 모델을 사용할 수 있어 성능이 향상됩니다.
    • 읽기 작업은 캐시, 읽기 전용 복제본 등을 활용하여 대규모 트래픽을 처리할 수 있습니다.
  2. 확장성:

    • 읽기와 쓰기가 독립적이므로, 시스템을 개별적으로 확장 가능. 예를 들어, 읽기 요청이 많으면 읽기 쪽만 확장(수평 확장) 가능.
  3. 복잡한 도메인 로직 지원:

    • 쓰기 모델에서 복잡한 비즈니스 로직을 구현할 수 있고, 읽기 모델은 단순히 데이터를 클라이언트가 원하는 형태로 제공하도록 설계 가능.
  4. 유연한 데이터 모델링:

    • 읽기와 쓰기에 각기 다른 데이터베이스나 데이터 구조를 사용할 수 있어, 읽기 모델을 최적화하거나 도메인 이벤트를 활용하는 등 다양한 설계를 적용 가능.
  5. 도메인 이벤트 활용:

    • Event Sourcing과 결합하면 시스템에서 발생한 모든 상태 변화를 이벤트로 기록하여 시스템 상태의 과거를 재구성하거나 추적할 수 있음.

...

단점

  1. 복잡성 증가:

    • 읽기와 쓰기 모델을 별도로 설계하고 구현해야 하므로 개발 및 유지보수 비용이 증가함.
    • 데이터 동기화가 까다로울 수 있음(Eventual Consistency).
  2. 개발 및 테스트 비용 증가:

    • 두 가지 모델과 관련 로직을 모두 테스트해야 하므로 더 많은 시간과 리소스가 필요함.
  3. 지연된 일관성:

    • 쓰기 작업 후 읽기 모델에 반영되기까지 지연(Latency)이 있을 수 있음(Eventual Consistency 모델 적용 시).


여기서는 상태있는 서비스개발과 CQRS둘다 사용되었으며~ 이 방식이 모든문제를 해결하는것이 아닌 상태없는 CRUD가 분명 대부분의 문제를 해결할수 있습니다.

장단점을 계속 비교하는것도 이것이 만능방식은 아니며 이러한 개발복잡성을 줄여주기위해

AKKA가 액터모델에 CQRS를 위해 지원하는 영속 AKKA 가 CQRS를 위해 액터모델에 지원하는 장치는 다음과같습니다.

Journal

이벤트 소싱(Event Sourcing) 방식을 사용합니다1.
액터의 상태 변경을 나타내는 이벤트들을 순차적으로 저장합니다1.
추가 전용(append-only) 로그 형태로 이벤트를 저장합니다1.
액터의 전체 상태 변경 이력을 보존합니다.
액터 복구 시 저장된 이벤트들을 재생하여 상태를 복원합니다3.

...

  • 저장 방식: Journal은 이벤트 로그, Snapshot은 전체 상태의 특정 시점 복사본, Durable State는 최신 상태만 저장합니다.
  • 복구 프로세스: Journal은 모든 이벤트 재생, Snapshot은 최근 스냅샷 + 이후 이벤트 재생, Durable State는 최신 상태만 로드합니다.
  • 데이터 보존: Journal은 전체 이력 보존, Snapshot과 Durable State는 특정 시점/최신 상태만 보존합니다.
  • 사용 사례: Journal은 감사와 시간 기반 쿼리에 유용, Snapshot은 복구 최적화, Durable State는 단순한 상태 관리에 적합합니다.


코틀린 순수 액터모델을 사용해  Journal + durable State 컨셉을 직접 구현해 적용되었습니다.적용해보았으며

모델의 Value 변화에따른 이벤트 버전관리는 제외 되었으며 완전한 컨셉은 PersistentDurableStateActor 를 통해 확인할수 있습니다.

...

상태관리 프로그래밍 방식이 왜 카프카에도 도입되고 활용하고 있는지?CRUD에서 해결하기 어려운 성능문제 해결에 이용되고 있는지 학습해볼 필요는 있습니다.


카프카에서 도입된 스트림을 통한 상태관리 프로그래밍 예

- https://velog.io/@ehdrms2034/%EC%B9%B4%ED%94%84%EC%B9%B4-%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%A6%88-DSL-%EA%B0%9C%EB%85%90
- https://breezymind.com/kafka-streams-basic/

...