최근 6개월간 나름 바쁜 시간이었습니다. 개인적으로 진행하는 프로젝트와 새로운 취미생활인 과자/케이크 만들기에 열중하다보니 한동안 아무 글도 쓰지 못했네요. 다시 조금씩 도메인 주도 설계 부분에 글을 쓰려고 합니다.
지금까지 도메인 주도 설계가 무엇인지에 대한 개략적인 고찰을 했고, 왜 마이크로 서비스를 도입하는지 또한 마이크로 서비스가 우리 시스템에 합당한지에 대해 얘기해 보았습니다. 이번에는 제가 실제 마이크로 서비스를 구현하면서 겪었던 단점들을 이야기 해보려고 합니다.
1. 데이터 유지보수의 어려움
내가 운영하는 데이터와 다른 마이크로 시스템과의 데이터가 틀어지는 경우들이 종종 있습니다. 이것은 아래에 설명할 트랜잭션 관리와도 연관이 있는데요, 데이터가 잘못되거나 서비스간 데이터가 일치하지 않는 경우 보정 작업을 해 주어야 합니다. 마이크로 서비스에서 데이터 베이스는 각 서비스마다 관리되므로, 다른 서비스의 데이터가 어떠한 상태인지 확인하기가 힘듭니다. 내가 저쪽 서비스 데이터 베이스에 접근 권한이 있으면 모를까, 그렇지 않다면 상대방 서비스 담당자와 계속적인 커뮤니케이션으로 잘못된 데이터를 찾아내고 보정하는 작업을 해야합니다. Monolythic 아키텍처에서는 내가 그냥 쿼리로 모든 데이터 조회가 가능하지만, 마이크로 서비스상에서는 이것이 불가능하니 잘못된 데이터를 찾는데도 시간이 많이 걸리고, 타 서비스와 긴밀한 협조가 이루어 지지 않으면 데이터 보정에도 많은 시간이 소요됩니다.
2. 트랜잭션 관리
CRUD에서 CUD의 트랜잭션 관리가 보통 힘든 것이 아닙니다. 분산 트랜잭션 관리, Two phase commit 같은 기능들이 있다고는 하지만, 이것을 적용하는 것이 어떻게 보면 서비스를 개발하는 것보다 더 힘든 경우들이 있습니다. 우리쪽 비즈니스 로직이 대부분 다른 서비스를 Call하여 CUD를 하는 작업이라면 나의 비즈니스 로직 개발에는 단시간, 하지만 트랜잭션 관리에 어마어마한 시간이 소요될 수도 있습니다. 비효율적인 작업이죠. 저희는 정말 데이터의 정합성이 중요한 것은 REST방식이 아닌 메시지로 처리하고, Two way message로 관리를 합니다. 저쪽에 메시지를 보내고 우리 데이터는 pending 상태로 만들고. 저쪽에서 적용 완료되었다는 메시지를 보내면 우리쪽 데이터를 pending에서 complete로 바꾸는 방식입니다.
3. 두개 이상의 서비스 데이터 결합 후 Sorting 및 Filtering
두개 이상의 서비스가 결합한 데이터를 Sorting 또는 Filtering하는 것은 마이크로 서비스에서 풀기 어려운 숙제 중에 하나 입니다. 예를 들어 수강자 정보를 보여주는 Grid 리스트가 있고, 리스트에는 사용자의 이름과 코스 이름을 보여준다고 생각해 보죠. 각 컬럼마다 sorting 및 filtering이 허용되고 pagination이 가능하다면 이 데이터들을 어떻게 조합해서 보여줄 수 있을까요? 각 서비스마다 엄청난 트랜잭션을 발생시키거나 어마어마한 양의 payload를 보내야 이 비즈니스 요건을 만족 시킬 수 있습니다. 이를 해결하기 위한 하나의 방법이 Reporting 서비스를 따로 만들고 모든 서비스에서 변경되는 데이터를 받아 리포팅을 만들어 줄 수 있는 서비스를 제공하는 것인데, 이것은 데이터 웨어하우스의 다른 이름입니다. 작은 서비스 하나 개발하는데, 데이터 웨어하우스를 구축하는 것은 전혀 효율적이지 못한 선택입니다.
4. 디버깅 헬
비즈니스 로직이 사방팔방에 분산되어 있다보니, 디버깅 하기가 어렵습니다. 어느 시스템에서 잘못된건지부터 파악해야 하는데, 하나의 비지니스 로직에 5개의 서비스가 능동적으로 통신을 한다면 어디서부터 꼬였는지부터 찾아내기가 어려워집니다. 그러다보니, 버그가 발생하면 원인을 찾기 위한 디버깅이 상당히 까다롭고, 이 또한 다른 서비스와 원활한 커뮤니케이션이 없다면 디버깅의 밑바닥 끝을 보게 될 것 입니다.
지금까지 제가 경험한 마이크로 서비스 단점이었는데요, 잘 이용하면 고기를 잘 자를 수 있는 날카로운 칼이나 잘못 이용하면 사람을 다치게 할 수 있는 흉기 같은 녀석이 바로 마이크로 서비스입니다. 물론 마이크로 서비스만의 장점도 있지만 이번에는 제가 접한 단점들만 이야기 해 보았습니다.
'개발 이야기' 카테고리의 다른 글
회사 어린이 크리스마스 파티 (0) | 2020.03.21 |
---|---|
캐나다 개발자 취업하기 (7) | 2020.02.15 |
도메인 주도 설계 - Context Map (0) | 2019.07.04 |
도메인 주도 설계 - 아마존 결제 프로세스 (0) | 2019.06.21 |
도메인 주도 설계 - Bounded Context 간의 통신 (0) | 2019.06.07 |
최근댓글