Ruby on Rails 기반의 Parse API는 200대의 서버와 인스턴스당 24개의 Unicorn 워커로 초당 3,000건의 요청을 처리했으나, 코드베이스 증가와 트래픽 급증으로 배포 시간이 20분까지 늘어나고 ‘graceful’하지 못한 재시작 문제가 발생했습니다. 특히 Rails의 ‘요청당 하나의 프로세스’ 모델은 느린 요청으로 인해 워커 풀이 고갈되어 API가 마비되는 현상을 초래했습니다. 이는 자동 스케일링으로도 대응하기 어려웠으며, Parse가 10배 성장을 앞두고 있다는 점을 고려할 때 근본적인 아키텍처 변경이 시급했습니다. 비동기 모델로의 전환을 위해 Parse 팀은 EventMachine, JRuby, C++, C#, Go 등 다양한 언어를 심층적으로 검토했습니다. EventMachine은 비동기 라이브러리 부족과 버그 문제가 있었고, JRuby는 JVM 관리의 어려움과 라이브러리 호환성 문제가 우려되었습니다. C++은 생산성과 유지보수 측면에서, C#은 Linux 환경 지원 측면에서 한계가 있었습니다. 최종적으로 Golang은 언어 자체에 내장된 비동기 처리 기능, 뛰어난 MongoDB 드라이버, 경량 Goroutine, 그리고 Go 개발에 대한 팀의 높은 관심과 우수 엔지니어 채용 용이성 등의 장점으로 인해 최적의 대안으로 선택되었습니다. 마이그레이션은 푸시 알림 백엔드부터 시작하여, 핵심 API 서버는 라이브 섀도잉 시스템을 통해 엔드포인트별로 점진적으로 전환되었습니다. 이 과정에서 가장 큰 난관은 Rails의 ‘관대한 수용’ 철학으로 인해 처리되던 비표준, 비문서화된 HTTP 요청(예: 이중 인코딩된 URL, 잘못된 Content-Length, 불필요한 바디 포함 요청, OAuth 오용, 유니코드 인코딩 오류 등)을 Go API에서도 동일하게 처리하도록 포팅하는 것이었습니다. 이는 Go 코드에 Rails의 ‘마법 같은’ 동작을 재현하기 위한 독특한 주석들을 남기게 했습니다.
Parse API: Ruby on Rails에서 Golang으로의 성공적인 마이그레이션
How We Migrated the Parse API from Ruby to Golang (Resurrected)
작성자
HackerNews
발행일
2025년 07월 24일
핵심 요약
- 1 Parse API는 확장성 및 안정성 문제로 인해 Ruby on Rails에서 Golang으로 전환되었습니다.
- 2 2년간의 마이그레이션은 비동기 모델 도입을 통해 배포 시간 단축, 서버 리소스 절감, 안정성 향상 등 큰 성공을 거두었습니다.
- 3 특히 Rails의 유연성으로 인한 비표준 요청 처리 로직을 Go로 이관하는 것이 주요 과제였으며, 이는 Go 코드에 독특한 주석을 남겼습니다.
도입
Parse API는 모바일 앱 개발 문제를 해결하기 위해 2011년 Ruby on Rails로 시작되었습니다. Ruby는 빠른 개발 속도와 풍부한 라이브러리 지원 덕분에 초기 버전을 신속하게 출시하고 기능을 빠르게 추가하는 데 기여했습니다. Unicorn, Capistrano, RVM, Chef 등 다양한 Ruby 기반 도구와 오픈 소스 젬을 활용하여 효율적인 개발 환경을 구축했습니다. 그러나 서비스가 급격히 성장하면서 Ruby on Rails의 '요청당 하나의 프로세스' 모델은 확장성과 안정성 측면에서 한계에 부딪혔습니다. 배포 시간이 길어지고, 서버 자원 소모가 커지며, 잦은 장애가 발생하는 등 심각한 문제에 직면하게 되었고, 이는 Parse 팀이 대규모 API 재작성 프로젝트를 통해 Golang으로의 전환을 결정하는 계기가 되었습니다.
결론
2년간의 Ruby on Rails에서 Golang으로의 API 마이그레이션은 Parse에게 혁신적인 변화를 가져왔습니다. 결과적으로 API의 안정성은 획기적으로 향상되었고, API 계층으로 인한 장애 발생이 거의 사라졌습니다. 운영팀의 잦은 호출과 수동적인 장애 복구 부담이 크게 줄어들었으며, 고객 만족도 또한 증대되었습니다. 비동기 모델 도입을 통해 API의 모든 동작을 쉽게 계측할 수 있게 되었고, API 서버 풀 크기를 약 90%까지 줄일 수 있었습니다. 또한, 스택에서 고립된 Rails API 서버 사일로를 제거하여 아키텍처가 대폭 간소화되었습니다. 통합 테스트 스위트 실행 시간은 25분에서 2분으로, 전체 API 서버 배포 시간은 30분에서 3분으로 단축되었으며, Go API 서버는 우아한 재시작을 지원하여 로드밸런서 조정이나 사전 워밍업이 불필요해졌습니다. Parse 팀은 Go가 빠르고, 계측하기 쉬우며, 자원 효율적이고, 배포가 용이하다는 점에서 매우 만족하며, 비록 힘들었지만 그만한 가치가 있는 여정이었다고 평가합니다. 이 성공적인 전환은 Parse의 지속적인 성장을 위한 견고한 기반을 마련했습니다.