본문 바로가기

Back-End 공부/SW공학

모놀리식 아키텍처 VS 마이크로서비스 아키텍처(MSA)

 모놀리식 아키텍처

  • 단일 대규모 애플리케이션
    • 모놀리식 아키텍처는 애플리케이션의 모든 기능이 하나의 큰 시스템으로 구축되는 방식
  • 통합된 개발 접근
    • 애플리케이션의 모든 구성 요소가 하나의 코드베이스에 통합되어 있으며, 이로 인해 소스코드가 서로 영향을 받고 배포 및 테스트가 복잡하고 어려워짐
  • 관리 및 유지보수의 복잡성
    • 상호 영향도
      • 하나의 모듈을 수정할 때, 이를 참조하거나 영향을 받는 모든 모듈들도 영향을 받을 수 밖에 없는 구조
    • 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와 컨테이너 환경구성

💡 쿠버네티스(k8s)의 활용과 MSA

  • 자동화된 배포와 롤아웃 관리를 통해 MSA환경에서의 빈번한 수정과 배포 가능
  • 자동 확장로드 밸런싱
    • 특정 서비스의 고 트래픽 상황시 빠른 자동확장 서비스와 로드밸런싱
  • 서비스 검색과 네트워킹를 통한 내부 통신 용이
    • 내부 서비스간의 통신 용이와 확장성이 하게 함으로서 MSA 컨테이너간의 통신에 최적화
  • 자원 관리 및 최적화
  • 서비스 Health Check 자동관리
    • 특정 컨테이너가 down된 상황을 자동으로 인지하고 컨테이너 재생성 또는 서비스 자동 재시작 기능
    • 부하량에 따라 자동 스케일 아웃, 스케일 인

 

💡 롤아웃

여러개의 pod를 모두 죽이지않고 순차적으로 업데이트하는 방식

A 저장소, B 저장소 동일 환경 유지

A 저장소 가동 중, B 저장소에는 새로운 기능들 추가

A -> B로 매끄럽게 전환 (무중단 배포)

 

 

 

- references

https://dev-coco.tistory.com/143

https://velog.io/@bye9/%EB%AA%A8%EB%85%B8%EB%A6%AC%ED%8B%B1-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90%EC%99%80-MSA

https://nginxstore.com/blog/microservices/msa-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC-%EC%A0%84%EB%9E%B5-%EC%A4%91%EC%9A%94%ED%95%9C-%EC%9D%B4%EC%9C%A0/

https://velog.io/@salgu1998/Kubernetes-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-Deployment