<시스템 디자인 연습> 준비

배경

‘대용량 트래픽’ 또는 ‘분산 시스템’과 같은 용어를 채용공고에서 접하는 것이 일반적인 경험이 된 지 오래다. 대규모 서비스를 운영하는 아키텍처 대부분이 분산 시스템을 기반으로 하고 있기에, 이를 이해하고 경험해봐야겠다는 생각을 한 지도 오래되었다.

그러나 대규모 분산 시스템을 실제로 경험하는 것은 쉬운 일이 아니다. 시니어 개발자들은 시스템 디자인 인터뷰 자리에서 복잡한 아키텍처를 뚝딱 그려낸다던데, 언제 그런 수준으로 성장할 수 있을지 의문이 들었다. “가상 면접 사례로 배우는 대규모 시스템 설계 기초"와 같은 훌륭한 책을 읽으며 이론적 지식을 쌓는 것은 유익했지만, 내 업무에 그러한 지식을 적용할 기회는 많지 않았다. 비즈니스에 도움이 되어야 쓸 수 있는게 기술이니까… 하는 아쉬움을 느끼며 실질적인 경험을 쌓기 위해 무언가 다른 접근이 필요하다고 생각했다.

그래서 분산 시스템을 설계하고 구현하는 토이 프로젝트를 시작하려 한다. 높은 부하를 견디는 규모 확장성에 관한 설계를 직접 구현해보며 확인 것이고, 와중에 새로운 문제를 만나 모르던 것을 알게 될 것이다. 이러한 경험을 꾸준히 이어가 더 전문성있는 엔지니어로 성장하기를 기대하며, 더 즐겁게 일하는 개발자로 발전하는 과정이라 믿는다.

목적

프로젝트의 주된 목적은 서비스 부하가 증가할 때 시스템에 발생하는 다양한 문제들을 직접 경험하고 해결하는 것이다. 부하가 증가할 때 시스템이 어떻게 반응하는지 관찰하고, 그에 맞는 적절한 구조적 조치들을 적용해보려 한다.

방식

목적 달성을 위해 부하 테스트를 활용하려한다. 가상의 트래픽을 생성해 시스템에 부하를 주고, 이에 따라 나타나는 시스템의 반응을 관찰하며 시스템을 점진적으로 개선해 나갈 것이다.

아래와 같은 서비스들을 테스트하겠다. 널리 알려진 시스템 디자인 시나리오들이다.

  • 피드 서비스: 사용자들이 게시물을 업로드하고, 이 게시물이 다른 사용자들의 피드에 실시간으로 반영되는 시나리오를 구현한다.
  • 채팅 서비스: 실시간으로 메시지를 주고받는 채팅 서비스를 구현한다. 웹소켓과 발행/구독 모델 등으로 시스템을 구성하고, 부하를 늘린다.

부하 테스트 시 눈여겨볼 지표를 정리했다.

  • RPS
  • 요청 실패 비율
  • 요청 처리 시간
  • 요청 전 차단 시간
  • cpu 사용량
  • 메모리 사용량
  • 네트워크 처리량

환경

서버

  • Python + Django + gunicorn: 가장 익숙한 스택으로 빠르게 구현
  • Python + Fastapi + uvicorn: 실시간 비동기 서버를 가볍게 구현

DB

  • SQLite or MySQL or PostgresSQL or Redis: 상황과 목적에 따라 선택

인프라

  • Docker Compose: 개발 환경 설정에 익숙하며, 여러 컴포넌트를 빠르고 효율적으로 실험하기 적합
  • AWS ECS Fargate: 도커 기반 컨테이너를 손쉽게 관리 가능. 서비스와 태스크로 구성해 배포하는 방식이 직관적

부하 테스트

  • K6 + Grafana + InfluxDB
    • 가벼우면서 러닝 커브가 낮은 k6 를 선택했다.
    • 테스트 결과를 시각화하는 일에 큰 리소스를 쓰고 싶지 않았다. 마침 k6는 grafana, influxdb 를 이용한 대시보드 템플릿이 이미 잘 만들어져있어 적합했다. javascript 로 테스트 시나리오를 작성할 수 있어 익숙한 탓도 컸다.
    • 그밖에 고려한 툴
      • JMeter, nGrinder 등도 많이 쓰이지만 간단한 부하 생성용으로는 무거워보였고, 러닝 커브가 상대적으로 높다고 판단했다.
      • locust는 파이썬 기반의 툴이라 반가웠지만, 신뢰가 가는 예제와 레퍼런스를 찾기가 상대적으로 어렵다는 느낌이 들었다.

refs

Posts in this Series