여는 글

안녕하세요~ 오랜만이네요. 부트캠프 시절, MSA 도전기로 블로그 포스팅하고 팀원들과 아키텍처를 설계했던 때가 생각이나면서 가장 열의를 보였던 그때의 저를 떠올리게 됐답니다. 그래서 쿠버네티스와 함께 MSA(Microservices Architecture)에 대한 지식 공유를 블로그를 통해 지속적으로 하면 좋겠다는 생각이 들었습니다.

앞으론 자주 포스팅할게요.. 요즘 쿠버네티스 관련 게시글들이 조회수가 많이 올랐던데..

MSA에서 데이터 관리하기

우선 자극적인 제목에 놀라셨다면 죄송합니다. 이래야 조회수가 잘나오는

아마 ‘당연한 얘기를 하고 있네’ 라는 생각 하실거에요. 어떤 소프트웨어라도 데이터 관리를 위한 Database 설계가 잘못되었다면 성능 저하, 비용 발생, 관리 복잡성 증가 등의 문제를 겪게 되니까요.

그래서 보통 모놀리식 앱(Monolithic App)과 연결된 RDB(Relationship Database)를 설계하는 경우에 데이터베이스 정규화(Normalization)과정을 통해 효율성을 점검 합니다. 정규화를 거치면서 중복을 배제하여 이상현상을 방지하고, 중복된 종속성을 여러 관계를 분할하고 효과적인 검색 알고리즘을 생성하는 것이죠.

하지만 MSA(Microservices Architecture)환경에서는 정규화 과정만으로는 해결되지 않는 까다로운 요소들이 있습니다.

Database Per Service

databaseperservice1 * 나쁜 예

첫번째는 Database Per Service입니다. 각각의 서비스가 한개의 데이터베이스를 가지는 것을 말하는데요. 이러한 사실은 MSA를 시작하는 단계에서부터 상당한 골치를 썪게 됩니다.

MSA가 모든 서비스가 독립적으로 실행시키겠다는 목적이 있는데, 두개의 서비스(서버)가 하나의 데이터베이스에 접근 한다면 서비스간 결합도가 증가하여 트랜잭션 처리, 동시성 제어 등 데이터베이스의 유지보수성과 확장성을 저하시키고 고위험 저효율이라는 단점만 가져가게 됩니다. 또한, 데이터베이스에 문제가 생겼을 경우 해당 데이터베이스와 연결되어 있는 모든 서비스들은 중단된다는 것이죠. (그럼 MSA가 아냐!)

기존 모놀리식 앱(Monolithc App)과 그 데이터베이스를 설계할때, 정규화 과정을 거치면서 중복을 없애고 관계 테이블을 생성해 나갔다면 MSA를 설계하는 과정에서는 중복 데이터가 생길 수 있음을 포용해야 하는 순간이 올 수 밖에 없는 것이죠.

서비스간 데이터 전달 - Event Driven Architecture(EDA)

databaseperservice2 * 나쁜 예

두번째는 ‘서비스간 데이터를 전달하는 방법’을 고려해야한다는 것입니다. 이러한 문제가 MSA(Microservices Architecture)에서 데이터 관리를 한층 더 복잡하게 만드는 요소입니다. 만약 서비스간 직접 통신 방식을 사용한다면 서버간 결합도가 증가하여 응답지연속도가 증가되고 서버의 불안정성을 초래합니다. 그리고 MSA가 지니는 ‘장애격리’라는 장점이 무색해집니다.

이러한 문제를 해결하기 위해, Event Driven Architecture(EDA)는 서비스 간 비동기 메시징 패턴을 사용하여 서비스의 독립성을 유지하는 아키텍처가 있습니다. 서비스가 필요한 또 다른 서비스를 호출하는 방식이 아니라 이벤트를 발행하고, 다른 서비스가 이러한 이벤트를 구독하여 필요한 동작을 수행하는 방식으로 동작시키는 것입니다.

그럼 여기서 고려해야할 것이 한가지 더 늘어나는데요.

데이터 일관성 및 동기화

세번째는 바로 ‘데이터 일관성 및 동기화’입니다. 각 서비스가 독립적인 데이터베이스를 가지고 있다는 것과 독립적인 데이터베이스간 데이터 전달을 위해 비동기 메시징 패턴 사용을 채택하였다면, 서비스 간의 데이터 일관성 유지는 머리를 지끈거리게 만듭니다. 일관성이 중요한 비즈니스 트랜잭션에서, 여러 서비스에 걸쳐 데이터의 정확성과 일관성을 보장하는 것은 쉽지 않은 작업이기 때문입니다.

정리

하지만 이런 문제점들이 두려워 MSA(Microservices Architecture)를 머뭇거리실 필요는 없습니다. 인기가 많은 아키텍처인만큼 위와 같은 고려해야 할 요소들을 해소해줄 수 있는 몇가지 해결책들이 연구되기 때문인데요. 다음 포스팅에서는 MSA에서 ‘독립적인 데이터베이스’,’서비스간 데이터 전달’,’데이터 일관성 및 동기화’ _이러한 데이터 관리 도전 과제들을 어떻게 수행해 나갈 수 있는지 포스팅 해보도록 하겠습니다._