간략한 요약
이 비디오에서는 NeetCodeIO가 DoorDash의 엔지니어링 리더인 Matt와 함께 마이크로서비스 아키텍처에 대한 심층적인 대화를 나눕니다. 마이크로서비스의 도입 배경, 개발 생산성, 기술 부채로서의 마이크로서비스, 그리고 DoorDash에서의 실제 경험을 중심으로 논의합니다. 또한 프로그래밍 원칙과 업계의 뜨거운 감자, 프로그래밍 조언까지 다루며, 마이크로서비스 아키텍처의 복잡성과 균형점을 탐색합니다.
- 마이크로서비스는 개발 초기에는 생산성을 향상시키지만, 장기적으로는 기술 부채가 될 수 있습니다.
- DoorDash는 급증하는 트래픽과 개발 속도 증가를 위해 마이크로서비스 아키텍처를 도입했지만, 이로 인해 복잡성이 증가했습니다.
- 업계는 모놀리식 아키텍처와 마이크로서비스 아키텍처 사이의 중간 지점을 제공하는 새로운 프레임워크를 개발해야 합니다.
소개
이 비디오는 DoorDash가 모놀리스에서 마이크로서비스 아키텍처로 전환한 경험에 대한 블로그 게시물에 대한 후속 논의입니다. DoorDash의 엔지니어링 리더인 Matt와 함께 마이크로서비스에 대한 그의 경험과 생각을 공유합니다.
마이크로서비스를 사용하는 이유
마이크로서비스 아키텍처를 도입하는 주된 이유는 개발 팀이 커지고, 여러 개발자가 동시에 동일한 코드베이스에서 작업하면서 배포 시 충돌이 발생하기 때문입니다. 마이크로서비스는 각 팀이 독립적으로 서비스를 배포할 수 있게 하여 이러한 문제를 해결합니다. 트래픽 증가로 인한 확장성은 마이크로서비스 도입의 주요 동기가 아니며, 고도로 확장 가능한 모놀리스 아키텍처도 존재합니다. 특수 하드웨어(예: GPU 추론) 또는 대용량 메모리 데이터 구조와 같은 특정 요구 사항도 마이크로서비스를 고려하는 이유가 될 수 있습니다.
개발자 생산성
Google Cloud의 프런트엔드와 같은 단일 페이지 애플리케이션에서도 개발 생산성 문제가 발생할 수 있습니다. 수많은 개발자가 동일한 애플리케이션에서 작업할 때, 한 팀의 배포가 다른 팀의 작업을 방해할 수 있습니다. 이러한 문제를 해결하기 위해 단일 페이지 애플리케이션을 독립적으로 배포 가능한 단위로 분할하는 방법이 사용됩니다.
마이크로서비스는 기술 부채
마이크로서비스는 초기에는 개발 속도를 높이는 데 도움이 되지만, 장기적으로는 기술 부채가 될 수 있습니다. 마이크로서비스가 호출 그래프의 일부가 되면, 해당 서비스가 항상 가동되어야 합니다. 모든 서비스가 가동되어야 하는 상황은 분산 모놀리스를 만드는 것과 같습니다. 마이크로서비스 아키텍처에서는 서비스 간의 변경 사항을 조정하고 배포하는 데 많은 노력이 필요하며, 오래된 코드를 정리할 동기가 부족해집니다.
DoorDash에게는 그만한 가치가 있었을까
DoorDash는 팬데믹으로 인해 트래픽이 급증하면서 개발 속도를 높이기 위해 마이크로서비스 아키텍처를 도입했습니다. 당시 모놀리스 아키텍처는 더 이상 감당할 수 없는 수준이었기 때문에 마이크로서비스로의 전환은 불가피했습니다. 현재 DoorDash는 수백 개의 마이크로서비스를 운영하고 있으며, 하나의 주문을 처리하는 데에도 많은 서비스가 관여합니다. 마이크로서비스 아키텍처는 DoorDash가 계속 성장할 수 있게 했지만, 동시에 많은 어려움을 야기했습니다.
프로그래밍 원칙
프로그래머는 종종 특정 프로그래밍 원칙에 맹목적으로 집착하는 경향이 있습니다. 예를 들어, 마이크로서비스 아키텍처에서 도메인 주도 설계 원칙을 지나치게 따르면 불필요하게 많은 서비스를 만들게 될 수 있습니다. 테스트 커버리지와 같은 지표도 맹신해서는 안 되며, 상황에 따라 유연하게 대처해야 합니다.
뜨거운 감자
업계는 모놀리식 아키텍처와 마이크로서비스 아키텍처 사이의 중간 지점을 제공하는 새로운 프레임워크를 개발해야 합니다. 현재는 모든 것이 단일 애플리케이션에 있거나, 수많은 네트워크 호출을 통해 통신하는 마이크로서비스 중 하나를 선택해야 합니다. Google의 Service Weaver와 같은 프로젝트는 이러한 문제를 해결하기 위한 시도이지만, 아직 완벽한 해결책은 아닙니다.
프로그래밍 조언
프로그래머는 새로운 라이브러리를 사용할 때 내부 작동 방식을 이해하려고 노력해야 합니다. 다른 사람의 코드를 실행하는 것을 두려워하고, 의존성에 대한 깊은 이해를 추구해야 합니다. 또한, 상황에 따라 "좋은 것"이 무엇인지 판단하고, 기술이 발전함에 따라 자신의 기술을 계속 발전시켜야 합니다.

