✅ 모놀리식 아키텍처
- 단일 대규모 애플리케이션
- 모놀리식 아키텍처는 애플리케이션의 모든 기능이 하나의 큰 시스템으로 구축되는 방식
- 통합된 개발 접근
- 애플리케이션의 모든 구성 요소가 하나의 코드베이스에 통합되어 있으며, 이로 인해 소스코드가 서로 영향을 받고 배포 및 테스트가 복잡하고 어려워짐
- 관리 및 유지보수의 복잡성
- 상호 영향도
- 하나의 모듈을 수정할 때, 이를 참조하거나 영향을 받는 모든 모듈들도 영향을 받을 수 밖에 없는 구조
- SW아키텍처의 복잡도와 배포의 어려움
- 소스코드의 영향도로 인해, 배포도 팀마다 불가능하고 전체 배포 시간을 정하여 모든 소스코드를 한꺼번에 반영.
- 일반적으로 새벽시간이나 DB작업 등 복잡한 작업의 경우엔 새벽에 진행. 심지어 변경의 규모가 큰 작업일 경우 명절 등 공휴일을 정해 배포
- 시스템 구성의 복잡성
- 시스템이 복잡해 개발의 영향도 파악이 어려움
- 상호 영향도
✅ 마이크로서비스 아키텍처(Micro Service Architecture)
- 폭포수 개발방법론에서 나오는 아키텍처가 모놀리식이라면, 일반적으로 애자일하게 일하는 조직에서 취할수 있는 아키텍처는 MSA
- msa는 독립적이고 작은 서비스들로 구성된 시스템을 의미
- 모놀리식에서 문제의 원인이었던 서비스들간의 의존성이 약화되거나 제거돼 느슨한 결합(loosely coupled) 상태로 구성
- 서비스는 저마다 데이터베이스를 가지며, 각 서비스마다 더 적합한 기술이 사용
- 서비스의 수정이 발생하여도 다른 서비스로의 영향이 없거나 적기 때문에, 독립적인 개발 및 배포가 가능
- 장애가 발생하더라도 장애 범위가 서비스에만 국한
- 특정 이벤트로 대량의 트래픽이 몰릴 경우, 해당 서비스에만 컴퓨팅 리소스를 더 투입하는 스케일 아웃 전략을 적용
💡 스케일 아웃 VS 스케일 업
스케일 업 : 기존 서버의 사양을 업그레이드 해 시스템을 확장하는 것
스케일 아웃 : 서버를 여러 대 추가하여 시스템을 확장하는 것
💡 MSA의 통신방식
- API기반 통신(동기)
- API(Application Programming Interface)
- 소프트웨어나 시스템 간의 상호작용을 가능하게 하는 규약 또는 인터페이스
- 즉, 소프트웨어 컴포넌트 간의 연결고리 역할을 하며, 사용자들이 복잡한 코드를 직접 작성하지 않고도 특정 기능에 대한 정보를 받거나 구현하는데 도움
- API는 주로 동기적 처리를 위한 용도
- 주문서비스에서 회원정보가 필요할 때, 회원 ID를 가지고 회원 서비스를 호출하여 정보를 조회
- 이벤트 기반 통신(비동기)
비동기 통신은 A -> B로 통신 시 B에 대한 응답을 기다리지 않는다. 해당 요청을 비동기적으로 처리한다.
- 비동기 또는 독립적 처리를 위한 용도
- Queue 사용해서 request 순차적으로 넣어놓고 단일 스레드가 여유있을 때 순차적으로 response
- 성능과 안정성이 높다 ( A-B 연결에 B가 죽어도 Queue에 처리할 게 쌓여있기 때문에 다시 구독해서 처리함)
- critical하게 동기화를 맞추지 않아도 되는 작업에 대해 사용
- 신규 주문 이벤트가 발생하면 주문 정보를 가진 메시지를 발행하고(중요한 것), 재고 서비스나 앱 푸시 서비스에서 해당 메시지를 구독하여 후속 처리(비교적 덜 중요한 것)
https://sihyung92.oopy.io/architecture/woowa-msa-travel
✅ MSA와 컨테이너 환경구성
- MSA는 경량화된 아키텍처로서 분산 아키텍처로 구성
- 경량화된 서버인 docker container와 같은 컨테이너 기반 아키텍처에 적합
- 확장가능성에 염두를 둔 MSA 설계사상과 확장에 유연하고 용이한 이미지 기반(실행파일=압축파일)의 컨테이너 서버구성은 상호 적합한 기술 선택지
- 쿠버네티스(k8s)와 같은 컨테이너 오케스트레이션 기술 덕분에 대규모 컨테이너 시스템을 기존의 legacy보다 효율적으로 관리할수 있는점이 큰 장점
- https://bosungtea9416.tistory.com/entry/AWS-AWS-ECS-%EB%B0%8F-EKS-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC-EC2-%EB%B0%A9%EC%8B%9D-Fargate-%EB%B0%A9%EC%8B%9D
💡 쿠버네티스(k8s)의 활용과 MSA
- 자동화된 배포와 롤아웃 관리를 통해 MSA환경에서의 빈번한 수정과 배포 가능
- 자동 확장과 로드 밸런싱
- 특정 서비스의 고 트래픽 상황시 빠른 자동확장 서비스와 로드밸런싱
- 서비스 검색과 네트워킹를 통한 내부 통신 용이
- 내부 서비스간의 통신 용이와 확장성이 하게 함으로서 MSA 컨테이너간의 통신에 최적화
- 자원 관리 및 최적화
- 서비스 Health Check 자동관리
- 특정 컨테이너가 down된 상황을 자동으로 인지하고 컨테이너 재생성 또는 서비스 자동 재시작 기능
- 부하량에 따라 자동 스케일 아웃, 스케일 인
💡 롤아웃
여러개의 pod를 모두 죽이지않고 순차적으로 업데이트하는 방식
A 저장소, B 저장소 동일 환경 유지
A 저장소 가동 중, B 저장소에는 새로운 기능들 추가
A -> B로 매끄럽게 전환 (무중단 배포)
- references
https://dev-coco.tistory.com/143
https://velog.io/@salgu1998/Kubernetes-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-Deployment
'Back-End 공부 > SW공학' 카테고리의 다른 글
GitHub 기본 명령어(add, commit, push), 커밋취소, 충돌해결 (0) | 2023.11.28 |
---|---|
소프트웨어 개발방법론(폭포수, 애자일) (0) | 2023.11.28 |