Etc ( 기타 )/Etc

[마이크로서비스] CQRS란?

노루아부지 2022. 10. 2. 22:18

CQRS란?

CQRS란 Command and Query Responsibility Segregation의 약자로, Command와 Query(Select)의 역할을 구분한다는 것입니다. 다시 말해서 CRUD에서 CUD(Command)와 R(Query) 즉 Read와 Write의 책임을 분리한 것이 CQRS입니다.

 

 

왜 CQRS인가?

최초 설계한 도메인 모델은 시간이 지남에 따라 비즈니스가 다양해지며 저장되는 모습도 다양해지고 보는 것도 다양해집니다. 또한 읽기/쓰기 작업으로 인한 리소스 교착 상태가 발생할 수 있습니다.

사실 일반적인 비즈니스 모델에서는 입력, 수정, 삭제가 조회보다 적게 쓰이고 조회가 훨씬 많이 사용됩니다. 서비스 내에 모든 기능을 넣어 두면 조회의 성능을 확보하기 위해 쓰기에 해당하는 부분도 같이 확장해야 합니다.

이런 방식은 효율적이지 않습니다.

이를 해결하고자 시스템의 상태를 변경하는 Command와 상태를 반환하는 Query의 책임을 분리하는 것이 CQRS 패턴입니다.

 

 

CQRS의 장점

  • Command와 Query 각각에 최적화된 데이터베이스 구성을 통해서 성능을 더 향상시킬 수 있습니다.
  • Command와 Query를 분리함으로써 aggregation(집계 함수) 등의 읽기를 위한 도메인 속성들이 생겨나는 것을 방지하여 Query로 인해 Entity의 구조가 변경되는 것을 방지할 수 있습니다.
  • Command와 Query 둘 중 한군데에서 장애가 발생해도 전체 서비스가 중단되지 않습니다.
    • 복잡한 비즈니스에 관련된 부분은 대부분 Command이기 때문에 Query의 모델은 상대적으로 쉽게 정리되며 join에 대한 부담도 줄일 수 있습니다.

 

 

CQRS의 종류

  1. 코드 수준 분리
    1. 한 어플리케이션 내에서 커맨드 모델과 쿼리 모델을 분리합니다.
    2. 책임을 코드 수준에서 분할합니다.
    3. 화면의 변경사항으로 인해 엔티티를 변경하지 않습니다.
    4. 단순하지만 확장성이 떨어지고 최적화에 한계가 있습니다.
  2. 서비스 수준 분리
    1. 커맨드 책임과 쿼리 책임을 서비스 수준으로 분리합니다.
    2. 각 서비스 별로 스케일 변경이 가능합니다. 따라서 부하가 집중되는 서비스만 스케일 아웃하여 부하를 분산시킬 수 있습니다.
    3. 단순하게 모델을 분리하는 것에 비해 복잡성이 증가합니다.
  3. 데이터베이스 분리
    1. polyglot 저장소 즉, 서비스별로 유리한 데이터베이스를 선택할 수 있습니다.
    2. 데이터베이스 간 동기화 방법을 고려해야 합니다.
      1. 브로커를 이용한 메시지 처리
      2. 데이터베이스 CDC(Change Data Capture)
    3. 동기화 오류로 인한 데이터 유실에 대해 고민해야 합니다.
    4. 트랜잭션 범위에 대해 고민해야 합니다.
    5. 데이터베이스의 일관성에 대해 고민해야 합니다.
    6. 시스템의 복잡성이 크게 증가합니다.

 

 

참고영상

배달의 민족 마이크로 서비스 여행기 - MSA 내에서 CQRS 사용하기

https://youtu.be/BnS6343GTkY

 

 

 

728x90
loading