티스토리 뷰
목차
오늘 오전 내내 수직적, 수평적 분할에 대해 공부했지만 지금도 헷갈려 죽겠다.
사람마다, 게시글마다 쓰는 단어도 다르고 개념도 뒤죽박죽이라서..
그 혼란에 내가 한 스쿱 더하는 느낌이 없지 않지만, 그래도 내가 이해한 분할에 대해 정리하고 넘어가야겠다.
기존의 모놀리식 아키텍처는 위 그림과 같이 모든 서비스와 레이어를 하나로 뭉쳐서 개발했다.
이는 초기개발이 쉬운 등 장점이 있지만 확장성이 떨어지는 단점도 함께 존재했는데,
장점과 단점에 대한 이런저런 기초는 이전 글에 정리했으니 여기선 넘어가기로 한다.
https://gnidinger.tistory.com/800
MSA를 구현하는 방법은 관점에 따라 다르겠지만 분할의 관점에서 보면 2(+1) 개의 컨셉이 있다.
나누어서 정리하긴 하겠지만 이 두 가지는 별개의 길은 아니고, 한쪽이 다른 한쪽을 보완하는 관계이거나 시간순의 관계이다.
어쨌거나 제목에 쓰여있는 수직적 분할과 수평적 분할이 그것인데, 순서대로 가볍게 훑어보자.
Vertical Partitioning
수직적 분할은 기존의 레이어 단계로 분할해 개발하던 방법에서 벗어나 서비스별로 모듈을 나누는 것을 가리킨다.
쇼핑몰 앱을 만든다고 쳤을 때 상품, 주문, 결제, 배송등의 영역을 각각 분리해서 개발하는 것이라고 할 수 있는데,
이때 데이터베이스는 보통 나눠진 영역 별로 따로 사용한다고 한다(아닌 경우도 있다).
이때 나뉘어진 서비스는 자신의 인터페이스를 가지고 있으며, 별개의 서비스처럼 구현 및 배포가 가능하다.
내 생각엔 보통 MSA 하면 떠올리는 이미지가 바로 이 수직적 분할이 아닐까 싶다.
바로 장단점을 정리하자면 대략 아래와 같다.
- 장점
- 확장성 - 원하는 기능이나 트래픽이 몰리는 서비스에 리소스를 손쉽게 추가할 수 있다.
- 적은 의존성 - 독립적인 서비스로 개발되기 때문에 기술스택 사용이 자유로우며, 일부의 장애가 전체로 번지지 않는다.
- 개별 테스트 및 유지보수 용이 - 적은 규모의 서비스로 나뉘었기 때문에 단위 테스트와 관리가 쉽다.
- 단점
- 네트워크 트래픽 - 서비스 간 상호작용을 위한 네트워크 트래픽이 추가로 발생하게 된다.
- 확장성의 한계 - 수직적 분할 후 리소스 할당은 상한선이 정해져 있으며, 수직적 분할의 횟수 역시 한계가 있다.
- 데이터 일관성 - 서로 다른 DB를 사용하기 때문에 데이터 일관성과 트랜잭션 처리가 필요하며, 이는 비용이 많이 든다.
이런 단점을 일부 보완하는 것이 수평적 분할이다. 계속해서 보자.
Horizontal Partitioning
수평적 분할은 기존의 서비스를 여러 대의 인스턴스로 확장하는 것을 가리킨다.
이는 서버의 수평적 확장, 수직적 확장을 말할 때의 수평적 확장과 비슷한 면이 있다.
이를 통해 트래픽이 몰리는 서비스의 인스턴스를 늘려 부하를 감소시킬 수 있으며,
수직적 분할보다 적은 비용으로 서비스의 성능을 높일 수 있다.
또한 수직적 확장이 물리적으로 DB를 분리했던 것과 비교하여 수평적 확장에서는 DB를 논리적으로 분리하며,
이는 간단하게 말하면 하나의 DB 안에서 테이블을 분할하는 것이라고 봐도 된다.
역시 장단점을 적으면 아래와 같다.
- 장점
- 수평적 확장 - 노드를 추가함으로써 적은 비용으로 트래픽과 데이터 처리량을 유연하게 늘릴 수 있다.
- 고가용성 - 하나의 서비스가 여러 개의 노드를 가지기 때문에 하나의 노드에 장애가 발생해도 서비스는 중단되지 않는다.
- 단점
- 네트워크 트래픽 - 수직적 분할에서와 마찬가지로 늘어난 노드 간의 데이터에 네트워크 부하가 발생한다.
- 데이터 일관성 - 수직적 분할에 이어 수평적 분할을 하면 당연히 데이터는 더욱 분산되며, 이를 관리하기는 매우 어렵다.
- 관리 문제 - 늘어난 노드는 시스템 관리의 복잡성을 늘린다. 시스템을 안정적으로 유지하기 위한 비용이 늘어난다.
장단점을 보면 둘이 크게 다른 점이 없어 보이는 것도 사실이다. 그래서 이렇게 헷갈리나..
어쨌거나 보통은 모놀리식 → 수직적 분할 → 수평적 분할의 순서로 MSA로의 마이그레이션이 진행된다고 한다.
이는 수직적, 수평적 분할이 어떤 것인지 알고 나면 어느 정도는 당연해 보이기도 한다.
Addition: Functional Partitioning
수직/수평적 분할에 대해 공부하다 만나게 된 단어이다. 처음에는 별개의 개념인가 했는데 그렇지는 않은 듯.
수직/수평적 분할이 아키텍처를 데이터의 관점에서 분할한다면 기능적 분할은 말 그대로 기능의 관점에서 나누는 것이다.
그러니까 기술적인 관점에서 수직적 분할이 DB를 물리적으로, 수평적 분할이 논리적으로 분할했다면
기능적 분할은 DB보다는 서비스와 그 기능(주로 비즈니스 로직)을 중심으로 분할하는 것이라 할 수 있다.
이는 내가 이해한 바로는 수직/수평적 분할이 끝난 서비스 안에서 기능별로 모듈을 만들어 더 작게 쪼개는 것이기도 하다.
... 하지만 아무래도 자신이 없다. 차후에 관련 논문이라도 읽으면서 글을 보충해야 할 듯.
어쨌거나 오늘의 MSA, 완!
'Development > MSA' 카테고리의 다른 글
[MSA]분산 트랜잭션(Distributed Transaction) 튜토리얼 (0) | 2023.04.19 |
---|---|
[MSA]분산 환경(Distributed Environment)에서의 내부 통신 (2) | 2023.04.16 |
[MSA]CAP Theorem (0) | 2023.04.01 |
[MSA]분산 서버 환경에서 세션 스토어 문제 (0) | 2023.03.19 |
[MSA]Microservice Architecture(MSA) 튜토리얼 (0) | 2023.03.17 |
- Total
- Today
- Yesterday
- BOJ
- Python
- 알고리즘
- 기술면접
- 파이썬
- Backjoon
- 여행
- 맛집
- 야경
- 리스트
- 세모
- 면접 준비
- Algorithm
- 남미
- 세계일주
- 칼이사
- 스트림
- 동적계획법
- RX100M5
- 자바
- 세계여행
- a6000
- 스프링
- 유럽여행
- 중남미
- 유럽
- java
- 백준
- 지지
- spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |