본문 바로가기
제가 왜 코딩을 하고 있을까요?/other

마이크로서비스 아키텍처

by asj8000 2019. 4. 28.
반응형

며칠 간 공부한 내용을 정리한 게시물입니다.

오류 지적은 언제나 환영입니다. :-)

 

 

모놀로식 아키텍처

마이크로서비스 아키텍처의 좀 더 쉬운 이해를 위해 반대되는 개념인 모놀로식 아키텍처에 대해 먼저 설명하겠다.

모놀로식 아키텍처란 널리 사용 중인 전통적인 아키텍처로 하나의 애플리케이션 안에 모든 컴포넌트를 포함하는 구조이다.

먼저 일반적인 형태의 개발 과정을 생각해보자.

1. 사용자의 입력을 받을 수 있는 UI 기획

2. 데이터를 관리할 적절한 스키마 설계

3. 어플리케이션을 하나로 만들고 사용자 입력을 받는 로직, DB에 저장하는 로직을 코드 하나로 개발한다.

 

이러한 과정들을 그림으로 표현하면 아래와 같다.

이 시스템은 하나의 애플리케이션으로 구성했기 때문에 개발과 배포 과정이 쉽고, 로드 밸런서를 활용해 애플리케이션의 인스턴스만 늘리면 DB의 부하 문제도 쉽게 해결할 수 있다.

 

( Node.Js로 모놀리식 서비스 만들기 : 링크 )

 

하지만, 일체형 시스템이라 여러가지 문제가 있다. 개발 초기 단계에 설계하지 않았던 기능을 추가한다던가, 설계치보다 높은 량의 분산 처리가 필요하다면 모놀로식 아키텍처의 한계점이 보이게 된다. 

단점들을 정리해보자

1. 분산 처리가 비효율적이다.

    모든 기능을 프로세스 하나로 개발해야하기 때문에 기능별로 분산 처리를 할 수 없다.

2. 코드를 유지보수하기 어렵다.

    코드 구조가 하나이기에 새로운 코드를 추가하려면 전체 소스를 이해해야 하고, 새로운 코드를 추가할수록 구조가 복잡해진다.

3. 새로운 기술을 적용하기 어렵다.

    기능별로 코드가 독립적이지 않아 적용하기 쉽지 않다.

 

이러한 한계점들을 해결하기 위한 새로운 아키텍처의 요구 사항은 다음과 같다.

코드 구조가 독립적이어야 하며, 기능별 분산 구조여야 하고, 기능별로 최적화된 기술 적용이 가능해야 한다.

 

이 한계들을 극복하기 위한 결과로 마이크로서비스가 등장했다.

 

 

 

 

마이크로서비스 아키텍처

마이크로서비스 아키텍처는 커다란 모놀리식 아키텍처를 단독으로 실행 가능한 다수의 모듈로 분해한 것이다.

이떄 실행 가능한 하나의 모듈을 마이크로서비스라고 한다.

각각의 마이크로서비스는 독립적인 프로세스의 형태로 따로 배포할 수 있어야 한다.

 

마이크로서비스는 독립적인 구조이기에 개발 언어나 프레임워크가 같을 필요가 없으며, 서로 독립적인 데이터 저장소와 네트워크 통신 기능을 가질 수 있다. 

위에서 나왔던 모놀로식 아키텍처의 구조를 마이크로서비스 아키텍처로 구성하면 아래와 같다.

 

 

Input / Output을 줄여서 I/O라 적는다.

관리하기 적당한 작은 단위로 기능을 분리하면 앞에서 언급한 문제점인 비효율적인 분산 처리와 코드의 복잡성을 해결할 수 있고, 기능별 최적화된 언어 및 프레임워크도 문제없이 사용할 수 있다. 

 

 

하지만 마이크로서비스에는 장점만 있는 것이 아니다.

대표적인 단점들을 정리해보자.

1. 공유 자원 접근이 어렵다.

    위 사진에서 데이터 관리 마이크로서비스가 회원 관리 마이크로 서비스의 데이터를 참조해야 한다면,

    모놀리식 아키텍처는 프로세스가 똑같기에 쉽게 회원 관리 로직으로 접근할 수 있지만, 

    마이크로프로세서는 다른 프로세스로 실행하기에 접근이 어렵다.

    물론 접근이 아예 불가능한 것은 아니다.

    ( 공유 자원을 처리하는 방법 : 링크를 후에 추가할 예정)

2. 배포와 실행이 복잡해진다.

   마이크로서비스는 서비스를 분할했기에 복잡한 실행 과정을 거쳐야만 서비스가 가능하다.

   ( 배포 자동화 : 링크 추가예정)

3. 분산 시스템을 구현하기 어렵다.

    마이크로서비스에는 독립적인 프로세스들을 동작하게 할 수 있는 분산 네트워크 시스템이 필요하다.

    매우 중요한 시스템이며 다양한 상황별마다 처리해야하니 구현하기 까다로운 점이 있다.

    ( 분산 아키텍처 : 링크 추가 예정)

 

 

마이크로서비스 아키텍처는 여러가지 마이크로서비스가 동작해야 하므로 마이크로서비스 하나는 구조가 작고 가벼워야한다.

유지 보수와 배포가 어렵고 오류가 많다면, 마이크로서비스 아키텍처는 아무 장점이 없는 아키텍처일 것이다.

 

대부분의 서비스는 정보를 저장하고 조회하는데 DB, 파일의 I/O가 필수적이다.

이떄 I/O가 동기 방식이라면 응답 대기 현상 때문에 성능이 좋지 않기에 이를 해결하기 위해 메시지 큐를 같이 사용한다.

 

요청을 받는 서버, I/O를 처리하는 서버,메시지 큐를 처리하는 것을 전부 포함해 마이크로서비스를 구현해야 한다면, 개발량도 많고 코드 구조도 매우 복잡해질 것이며 배포 또한 쉽지 않을 것이다.

 

하지만 Node.js는 내부적으로 이러한 매커니즘을 전부 처리해주기에 크게 고민하지 않아도 된다.

Node.js는 싱글 스레드를 기반으로 코딩하기 때문에 스레드 동기화나 교착상태를 신경쓸 이유가 없고,

JS를 기본 언어로 사용하기에 문법이 쉬워 마이크로서비스를 구현하기 좋다.

메시지 큐 기능이 자체적으로 들어있으며, 사랑받을 이유가 충분한 프레임워크다.

반응형

댓글