카테고리 없음

CQRS(Command Query Responsibillity Segregation)

코딩하는이씨 2024. 4. 1. 23:31
728x90
반응형

CQRS (Command Query Responsibillity Segregation) 패턴


CRUD에서 R(query)와 CUD(command)를 구분하는 방식이다. 읽기전용 DB와 쓰기 전용 DB를 분리해 빠른 읽기를 구현할 수 있다.

MSA에서 CQRS 패턴은 높은 성능과 각 마이크로 서비스간 책임의 분리를 위해 사용된다.

CQRS는 실제 마이크로 서버들의 운영상태와 관계없이 항상 안정되게 운영되며 원본을 가져오는 것이 아닌 미리 뷰를 구성한다.

 

만약 각 마이크로서비스를 직접 호출해 결과를 돌려주는 방식으로 뷰를 구성한다면 어떻게 될까. 당연히 데이터를 제공할 수 없게된다. 마이크로서비스 끼리 장애 전파가 일어난다는 이야기이다. 장애 전파를 없애기 위해 MSA를 사용했지만 결국 사용자에게 일부 서비스 장애로 인해 뷰를 제공하지 못하는 일이 일어날 수 있다.

 

 

CQRS는 뷰를 제공하는 마이크로 서비스를 만들어 읽기를 위한 DB에 데이터를 적재해두고 요청이 오면 서비스를 제공한다. 이를 통해 조회시 원본 데이터에 접근하지 않기 때문에 마이크로서비스들의 운영상태와 관계없이 높은 성능으로 조회를 가능하게 해준다.

 

장점

  • 데이터 원본에서 직접 매번 가져오는 대신, 필요한 데이터를 미리 취합하여 View로 만들어 둠으로써 읽기 작업의 효율성을 높일 수 있다.
  • 읽기 작업과 쓰기 작업을 분리하여 각각의 DB를 사용함으로써, 시스템의 응답 시간을 최적화 할 수 있다.
  • Query 뷰를 다양하게 구성하여 여러 MSA 서비스 목적에 맞추어 각 서비비스가 독립적으로 DB를 가지도록 구현할 수 있다.

그림과 같이 각 마이크로 서비스들에서 이벤트가 발행되면 필요한 이벤트들을 수신해 DB에 적재한다.

 

이렇게 읽기 전용 Database가 분리되게 됨으로 클라이언트 요청시 원본 데이터를 조회하는 것이 아닌 읽기 전용 데이터베이스에 미리 저장된 데이터를 전송하게된다.

 

기존에는 하나의 데이터베이스에서 수많은 테이블에서 Join문을 이용해 데이터를 가져와야 했다. 하지만 CQRS 패턴을 이용하면 이벤트가 발행될 때마다 필요한 데이터들을 적재해 원본 데이터를 요청하지 않고 클라이언트에게 응답할 수 있게 되었다. 또한 각 마이크로 서비스가 장애로 인해 데이터 요청에 대해 응답하지 못해도 클라이언트에게 조회에 필요한 정보들을 제공할 수 있게 되었다. 또한 데이터가 이미 저장되어 있기 때문에 조회 속도에서도 이점을 얻을 수 있다.

 

728x90
반응형