마이크로서비스 아키텍처는 복잡한 대규모 시스템을 효과적으로 운영하는 데 많은 이점을 제공하지만, 동시에 특정 도전 과제를 동반합니다. 특히 2,800개 이상의 마이크로서비스를 운영하는 Monzo는 이 아키텍처를 통해 운영에서 많은 가치를 얻었지만, 더 이상 사용하지 않는 라이브러리에서 새로운 라이브러리로의 마이그레이션 과정에서 발생하는 복잡한 문제에 직면하게 되었습니다. 이번 글에서는 Monzo가 이러한 마이그레이션 문제를 해결하기 위해 선택한 전략과 핵심 기술을 알아보겠습니다.
Monzo의 마이그레이션 전략 개요
Monzo는 중앙 집중식 마이그레이션 방식을 채택하여, 복잡한 시스템에서 서비스 소유자에게 마이그레이션 책임을 넘기기보다는 단일 팀이 마이그레이션을 주도하는 것을 선호합니다. 이를 통해 마이그레이션 과정에서 발생할 수 있는 조정 오버헤드와 프로젝트 중단 위험을 최소화하고, 신속하고 효율적인 마이그레이션을 구현하고 있습니다.
1. Monorepo와 일관된 기술 선택
Monzo는 monorepo를 사용하여 모든 서비스 코드를 관리합니다. 이는 대규모 리팩토링을 훨씬 쉽게 수행할 수 있게 하며, 일관된 기술 환경을 유지하는 데 중요한 역할을 합니다. 모든 서비스가 **Go 언어**로 작성되었고, 동일한 버전의 라이브러리를 사용하고 있기 때문에 자동화 도구 사용이 용이합니다. Monorepo는 코드 변경이 필요한 모든 서비스를 한 번에 다룰 수 있어, 일관된 리팩토링을 지원하는 이상적인 환경을 제공합니다.
2. 중앙 집중식 마이그레이션의 필요성
대규모 마이그레이션에서는 다수의 서비스가 동시에 변경되므로 프로젝트 중단 위험과 비일관성이 발생할 수 있습니다. 이를 방지하기 위해 Monzo는 중앙 집중식 마이그레이션 방식을 선호합니다. 이는 단일 팀이 마이그레이션을 주도하여 전반적인 일관성을 보장하고, 각 서비스 소유자가 개별적으로 처리할 필요가 없도록 하는 전략입니다.
Monzo의 팀은 마이그레이션 과정에서 자동화 도구에 강력하게 의존합니다. 이러한 도구들은 대량 서비스 배포나 자동화된 롤백 검사와 같은 작업을 수행하여 효율성을 극대화합니다. 또한, 기술적 일관성을 유지하는 것이 매우 중요하며, 이를 통해 모든 서비스에서 동일한 방식으로 마이그레이션을 처리할 수 있습니다.
단계별 마이그레이션 절차
1. 마이그레이션 계획 및 정렬
마이그레이션은 매우 신중한 계획이 필요한 과정입니다. Monzo는 마이그레이션 계획 프로세스를 투명하게 운영하며, 모든 엔지니어가 기여할 기회를 제공합니다. 마이그레이션은 제안서와 아키텍처 검토를 통해 계획됩니다. 제안서는 회사의 모든 사람이 의견을 말할 수 있는 Slack 채널에 공유되며, 중요한 변경 사항은 동기식 아키텍처 검토 회의에서 다루어집니다.
2. 이전 라이브러리 래핑
Monzo는 새로운 라이브러리를 설치하기 전, 이전 라이브러리를 래핑하여 호환성을 유지하고 서비스를 쉽게 재배포할 수 있도록 합니다. 이를 통해 모든 호출 사이트를 업데이트하는 대신 기존 라이브러리를 통해 새로운 라이브러리로의 마이그레이션을 점진적으로 진행할 수 있습니다. 이 과정에서 래핑된 라이브러리는 Monzo의 원격 측정 라이브러리로 계측됩니다.
3. 호출 사이트 업데이트
모든 서비스에서 자주 참조되는 함수와 유형은 자동화 도구를 통해 리팩토링되며, 이는 주로 `gopls`와 `gorename` 도구에 의해 수행됩니다. 몇 군데에서만 참조되는 긴 꼬리 패턴의 함수들은 수동으로 마이그레이션되며, 경우에 따라 기존 API로 전환됩니다. 이는 마이그레이션 중에 발생할 수 있는 혼란을 최소화하고, 코드 일관성을 유지하는 데 도움을 줍니다.
대규모 서비스 배포와 자동화
대량 서비스 배포는 Monzo의 핵심적인 마이그레이션 전략입니다. 서비스가 새로운 라이브러리를 지원하는지 확인한 후, 자동화된 비동기 일괄 작업을 통해 대량 배포 도구를 사용하여 모든 서비스에 변경 사항을 적용합니다. 이는 롤백 검사를 자동화하여, 오류 발생 시 빠른 복구가 가능합니다. Monzo는 대규모 변경 사항의 경우 점진적인 롤 포워드를 사용하며, 빠른 롤백을 통해 문제 발생 시 빠르게 대응할 수 있습니다.
구성 제어를 통한 빠른 롤아웃
Monzo는 일반적인 배포 방식 대신, 구성 시스템을 통해 새로운 기능을 활성화하는 방법을 사용합니다. 구성 시스템을 통한 롤아웃은 매우 빠르며, 모든 서비스가 60초마다 구성을 새로 고치므로 필요한 경우 즉시 롤백이 가능합니다. 이러한 방식은 특정 사용자 집합에만 새로운 기능을 활성화하는 유연성을 제공하며, 매우 효율적인 롤아웃을 지원합니다.
결론: 기술적 일관성과 자동화의 중요성
Monzo가 2,800개 이상의 마이크로서비스를 운영하며 마이그레이션을 성공적으로 수행할 수 있었던 이유는 일관된 기술 선택과 대규모 자동화의 덕분입니다. 단일 팀이 주도하는 중앙 집중식 마이그레이션은 시스템의 일관성을 유지하고, 효율적으로 마이그레이션을 완료할 수 있게 하였습니다. 또한, 자동화 도구를 적극적으로 활용하여 대규모 배포와 롤백을 효율적으로 관리하였습니다.
이러한 전략을 통해 Monzo는 대규모 시스템에서도 신속하고 안전하게 마이그레이션을 수행할 수 있었으며, 이는 다른 기업들도 도입할 만한 가치가 있는 접근 방식이라고 할 수 있습니다.
참고 자료: monzo, “How we run migrations across 2,800 microservices”