다음 특징을 갖는 서비스들의 조합으로 이뤄진 설계
- 유지보수에 유리하고, 테스트 가능해야 함
- 느슨하게 결합되어야 함
- 독립적으로 배포 가능함
- 비즈니스 역량을 중심으로 구성해야 함
- 작은 팀에 의해 소유됨
- 컴포넌트 : 독립적으로 대체하거나 업그레이드 가능한 소프트웨어 단위
- 컴포넌트화 : 시스템을 구성 요소(Component)를 나누고 이를 연결하여 구축하는 것
- 컴포넌트화는 어떻게? : 소프트웨어를 여러 서비스로 분리 하는 것
before : 기술적 계층에 따른 팀 분류
예) UI 팀, 비즈니스 로직 팀, 데이터베이스 팀
단순한 변경이 필요한 경우에도 팀 간의 협업 비용이 증가함.
after : 비즈니스 수행 능력(업무 도메인)에 따른 팀 분류
다른 말로 표현하면 서비스(엔드포인트)는 일을 하게 하고, 통신(파이프라인)은 최대한 단순하게 한다.
대표적인 방법.
1. REST API(HTTP)
2. 메시지 버스를 이용한 메시지 전달 (메시지 큐)
중앙 집중적인 시스템은 기술을 표준화하는 경향이 있다.
"회사에서는 Java 9 와 Oracle 만 사용한다."
"간단한 리포트 만드는 서비스가 필요한데, node.js로 금방하는걸 Java를 써야되는가?"
문제 해결에 방해가 될 수 있다.
해결책
도메인 경계를 분평하게 해야한다 !
오래전에는 애플리케이션을 배포하려면 직접 하드웨어 서버를 구매해서 구성했다. 이때는 하드웨어와 소프트웨어 둘다 관리를 했어야 하며, 하드웨어의 직접적 관리는 이점도 있었지만 서버 관리에 많은 비용을 지불해야 했고 메모리 관리와 같은 불편한 점도 있었다.
이런 서버의 하드웨어 관리의 어려움을 해결해준 것이 AWS 클라우드 컴퓨팅 서비스 EC2 였다. 이로서 하드웨어 관리의 불안감을 덜 수 있게 되었다. 하지만 빌려서 구성한 서버의 소프트웨어도 보안, 업데이트, 백업와 같은 많은 관리 과정이 필요하다. 이때 이런 서버의 소프트웨어 관리의 어려움을 해결하는 방안으로 Serverless가 등장한 것이다.
마이크로 서비스와 서버리스가 공통적으로 추구하는 방향은 비즈니스 로직에 집중 할 수 있다. 개발자는 서로 독립된 서비스에서 개발을 하고 서버를 신경을 쓰지 않기 때문에 오로지 개발에만 집중을 할 수 있는 환경이 구성되고 그로 인해 개발의 생산성이 올라가게 된다.
서버리스는 기본적으로 현재 상태에 대한 데이터를 저장하지 않는다. 이를 무상태성이라 한다.
무상태성은 현재 시점의 상황이나 상태가 저장되지 않아 다른 상태에서 전에 있었던 상태를 알 수 없다는 것.
무상태성은 서버리스와 아주 어울리는 특징이라고 생각한다.
그래서 보통 무상태성에서는 클라이언트가 서버로부터 무언가를 요청할 때 데이터를 다 그때그때 넘기게 되면 여러 서버에서 현재상태에 대한 데이터를 저장하지 않아도 된다. 이로 인해 엄청난 확장성을 가져올 수 있다.
마이크로 서비스 아키텍처는 각 마이크로 서비스가 자체 도메인 데이터가 있는 별도의 데이터베이스를 가지도록 설계해야 한다. 이렇게 해야 마이크로 서비스를 독립적으로 배포하거나 확장 할 수 있기 때문
데이터베이스를 한곳에서 관리하기엔 어떤 서비스의 경우 동기화된 데이터가 필요하고 어떤 서비스는 비동기화 데이터가 필요 할 수 있다. 또 서비스의 트래픽이 커짐에 따라 한곳에서 관리하다가 문제가 발생시 서비스 전체 장애가 발생 할 수 있기 때문에 따라서 규모가 있는 서비스라면 DB까지 서비스별로 분리해서 사용하는 것이 좋다.
제 생각에는 데이터의 중복이 많으면 하나의 서비스로 구성하여 운영하고, 만일 성향이 다른 서비스의 경우에는 불가피하게 데이터의 복제와 중복의 허용이 어느정도는 필요하다고 생각한다.
모범사례로 배달의 민족 초창기 16년까지는 서비스는 분리 했지만 고성능 루비DB에다 모든 데이터를 관리하는 방식을 사용하였고, 그러다 하나의 서비스가 에러가 났는데 통합된 DB인 상황이어서 서비스까지 마비되는 사건 이후 마이크로 서비스로 변경을 시작 서비스별로 DB를 조금씩 분리하여 19년 11월에 완전한 마이크로 서비스를 완성했다고 한다.