마이크로서비스와 분산 아키텍처

지금까지 Node.js를 이용해 간단한 e-commerce 서비스를 만들어 보았습니다. 모든 요구 사항을 충족했음에도 시간이 흐를수록 기능은 복잡해지고 처리해야 할 용량은 증가할 것입니다. 초기에는 소수 인원으로 구현할 수 있었지만, 점차 많은 인원이 필요할 것이고 많은 인원이 복잡한 시스템을 유지 보수하는 과정에서 다양한 문제점도 발생할 것입니다. 기업에서는 이렇게 발생한 다양한 문제점을 줄이려고 빠른 개발보다는 안정적인 개발을 추구하려고 할 텐데, 그러면서 서비스 업데이트 주기는 느려질 것입니다. 결국 기존 시스템이 새로운 서비스의 방해 요소가 될 것입니다.

실제로 적은 인원의 스타트업 기업보다 풍부한 인력을 보유한 대기업의 업데이트 주기가 오히려 더 느린 경향이 있습니다. 이러한 문제점의 근본 원인은 무엇일까요? 바로 모놀리식 아키텍처가 지닌 한계 때문입니다. 그럼 마이크로서비스 아키텍처가 이러한 문제점을 어떻게 해결할 수 있는지 알아보겠습니다.

모놀리식 아키텍처와 마이크로서비스 아키텍처

모놀리식 아키텍처와 마이크로서비스 아키텍처

마이크로서비스 아키텍처는 기본적으로 분산 아키텍처입니다. 분산 처리를 하면 흔히 부하 분산을 먼저 떠올립니다. 서비스 초기에는 “우리 서비스는 아직 사용자가 많지 않으니 분산 아키텍처는 필요 없어.”라고 생각하기 쉽습니다. 그러나 하드웨어 결함, 네트워크 문제, 버그, 운영상의 실수 등 부하 문제 외에도 다양한 이유로 프로세스는 언제든지 종료될 수 있습니다.

모놀리식 아키텍처는 모든 기능을 프로세스 하나로 구성하기 때문에 이러한 장애 상황에 매우 취약하고, 장애가 발생하면 전체 서비스가 중단되기 때문에 피해 또한 심각합니다. 아키텍처를 변경하는 작업은 기술적으로 어렵고 신중하게 해야 합니다. 그래서 네트워크 스위치 장비 등을 이용해 모놀리식 아키텍처는 그대로 유지하면서 이중화를 구성하는 방식을 많이 사용합니다. 하지만 이 방식은 비용이 많이 발생하고 효율적이지 못하다는 단점이 있습니다. 먼저 소프트웨어 수준의 분산 처리 방법을 알아보고, 마이크로서비스 아키텍처에 적용하는 방법도 살펴보겠습니다.

토폴리지의 이해

분산 아키텍처를 구성하려면 시스템 간 네트워크를 어떻게 연결할지부터 고민해야 하기에 먼저 토폴로지부터 이해해야 합니다. 토폴로지는 컴퓨터 네트워크를 구성할 때 링크, 노드 등을 이용해 물리적으로 연결하는 방식을 의미합니다. 토폴로지에는 버스형, 트리형, 링형, 성형, 망형이 있습니다. 토폴로지를 간략히 알아보겠습니다.

버스형

버스형(bus)은 전체 노드가 하나의 공통 연결선에 연결된 구조입니다. 버스만 안정적이라면 노드 간 간섭이 없어 안정적이고, 노드 추가·삭제가 매우 쉽습니다. 하지만 공통 연결선인 버스에 부하가 발생하면 전체 성능이 저하되는 단점이 있습니다.

버스형

버스형

트리형

트리형(tree)은 여러 버스 토폴로지를 결합한 구조입니다.

트리형

트리형

링형

링형(ring)은 부하가 집중되는 노드가 없어 병목이 발생하지 않으나, 한 노드의 장애가 전체 장애로 이어지는 단점이 있습니다.

링형

링형