Shopify 아키텍처의 진화



Shopify(쇼피파이)가 성장에 대응하기 위해 기술적으로 발생한 이슈와 선택한 기술을 공식 발표 자료를 조사하여 정리한 글입니다.

2013년~2018년 기간의 공식 발표 자료를 조사한 결과물이며, 잘못되거나 누락된 정보가 있을 수 있음을 인지하고 읽어주세요.

목차


요약

쇼피파이는 마이크로서비스 아키텍처(MSA)가 아니라고 말합니다. 하지만 일부 기능이 도메인별로 분리되어 있고 이를 관리/추적하기 위한 ServicesDB 자체 도구를 만들어 도메인별 이슈를 해결하고 있습니다.

모놀리식 아키텍처로 단위 테스트가 약 10만건이며 ORM 의존도가 높아서 CI에 많은 시간과 리소스가 투입되고 있는데, 효율화를 위해 배포 도구로 Shipit를 사용하며 소스 병합은 Merge Queue 라는 개념을 추가했습니다.

쇼피파이에게 배울 점 3가지는 아래와 같습니다.
  • 유행하는 기술 문화가 아닌 “DevOps vs SRE vs PE” 분석 후 자사에 적합한 PE를 선택
  • DB Connection Pool 이슈를 해결하기 위한 방법으로 GraphQL과 GCP MySQL 순으로 순차 적용
  • 클라우드 환경이 아닌 상태에서 백업 서버가 즉시 프로덕션 서버로 전환될 수 있는 환경 구축

2018년



  • 모놀리식 아키텍처를 인프라만 Kubernetes로 전환
    • MySQL도 자체 데이터센터에서 구글 클라우드 서비스로 전환
    • 쇼핑몰 별 분산 처리 관리 비용이 늘어나자 해결 방안으로 구글 클라우드를 선택

2017년

  • 여전한 모놀리식 아키텍처
  • SPA 기술 변화: React와 TypeScript로 전환

2016년



  • 멀티 데이터센터 아키텍처
    • 운영 서버에 이슈가 발생하면 재해 복구 서버로 우회하도록 처리
      • 여기서 쇼피파이는 Mult DC Podding이란 용어를 사용함
  • SPA 기술 변화: 정적 HTML 페이지 및 VanillaJS 사용
  • GraphQL 적용 추측
    • GraphQL 발표가 2015년이고 쇼피파이의 GraphQL 발표가 2016년에 있는 것으로 보아서 추측

2015년



  • 재해 복구를 위한 백업 데이터 센터 운영

2013/2014



  • Memcached, Redis도 멀티 테넌트 아키텍처를 적용하면서 데이터베이스 격리 작업
    • MySQL, Memcached, Redis 3개의 데이터베이스 그룹으로 인스턴스를 운영
      • 여기서 데이터베이스 그룹을 쇼피파이는 pod이란 용어를 사용함
  • SPA 기술 적용: jQuery와 Batman.js
  • AWS S3
    • 제품 이미지, 테마(쇼핑몰 디자인 파일)
    • 오브젝트 스토리지를 사용하며 파일트리 시각화 도구로 화면 표시
    • 오브젝트 스토리지 파티션 이슈 발생(참고)

2005년

  • 멀티 테넌트 아키텍처
    • MySQL 상점별 데이터베이스 분리 및 샤딩
  • 단, Memcached, Redis는 싱글 테넌트 아키텍처

2004년

  • 싱글 테넌트 아키텍처
    • MySQL 단일 인스턴스
  • Ruby on Rails 1.0

초기




참고 자료

기술 문화(Tech Culture)

2018 - 조직 문화를 꾸준하게 유지

2017 - 조직 문화를 장려

2016 - 조직에 적합한 문화을 연구하여 결정 - 프로덕션 엔지니어링!

  • Why Shopify Moved to The Production Engineering Model
    • DevOps → Facebook Production Engineering (PE) vs. Google Site Reliability Engineering (SRE)
      • Production Engineering (프로덕션 엔지니어링)!
      • 소프트웨어 엔지니어링 + 시스템 엔지니어링입니다.
      • 서비스를 이해하여 디버깅이 가능하면서 전반적인 시스템 수정이 가능한 팀입니다.

아키텍처(Architecture)

2018 - Google Cloud 기반으로 인프라 전환

2017 - 클라우드 기반 준비

2016 - 분산 처리를 연구하며 컨테이너 운영 고도화

2015 - 컨테이너 운영 경험 쌓기

2014 - 도커의 시작

2013 - AWS S3 사용

마무리

결국은 퍼블릭 클라우드를 사용하네요.
그리고 수정해야 될 부분이나 추가적으로 알고 있는 부분이 있다면 알려주세요.