초기에는 주기적으로 업데이트되지 않은 사용자 데이터를 일괄적으로 쿼리하여 동기화 작업을 스케줄링했습니다. 이 방식은 큐에 엄청난 수의 작업이 한꺼번에 몰리게 하여 CPU 부하 증가, 큐 깊이 심화, 오토스케일링 인스턴스 증가로 인한 비용 폭증, 그리고 데이터베이스 부하 폭증으로 이어지는 악순환을 초래했습니다. 이는 애플리케이션의 서비스 거부 공격(DoS)과 유사한 상황을 스스로 만들어내는 결과를 낳았습니다. 이러한 불균일한 부하를 해결하기 위해 발표자는 시뮬레이션 기법을 도입했습니다. 작업 완료 시간을 APM(AppSignal)의 백분위수 데이터로 분석하고, ChatGPT의 도움을 받아 ‘역변환 샘플링(Inverse Transform Sampling)’ 알고리즘을 통해 실제와 유사한 가상 작업 시간을 생성하여 시뮬레이션을 실행했습니다. 시뮬레이션 결과는 SQLite 데이터베이스에 기록되어 다양한 스케줄링 방안의 효과를 비교하는 데 활용되었습니다. 핵심 해결책은 ‘슬롯 스케줄링’입니다. 이 방식은 전체 사용자 기반을 여러 ‘슬롯’으로 나누고, 각 슬롯에 해당하는 사용자 작업을 특정 시간에 순차적으로 처리하는 것입니다. 이를 위해 Ruby 표준 라이브러리의 Random
클래스(Mersenne Twister 알고리즘)를 활용하여 사용자 ID로부터 예측 가능하고 균일하게 분산된 지연 시간을 부여했습니다. 특히 UUID 기반의 Primary Key를 사용하는 경우, UUID를 바이트로 변환한 후 마지막 바이트를 사용하여 슬롯을 할당함으로써 균등한 분포를 보장했습니다. 슬롯 개수 결정에는 gcd
(최대 공약수) 메서드를 활용하여 주기 시간 내에 정수 개의 슬롯을 생성할 수 있도록 했습니다. 이러한 3단계 워크로드(부트스트랩 작업 -> 슬롯별 작업 -> 사용자별 동기화 작업) 분할을 통해, 큐에 한꺼번에 대량의 작업이 유입되는 것을 방지하고, 데이터베이스 인덱싱 및 잠금 경합 문제를 완화했습니다. 또한, 특정 계정에 대한 ‘결제 승인’과 ‘보고서 생성’과 같이 서로 충돌할 수 있는 작업들을 슬롯 스케줄링을 통해 시간적으로 분리하여 동시성 문제를 해결하는 데도 활용되었습니다.
슬롯 스케줄링의 장점과 GCD 메서드 활용
Julik Tarkhanov, "On the benefits of slot scheduling"
작성자
EuRuKo
발행일
2025년 01월 13일
핵심 요약
- 1 본 발표는 Ruby on Rails 기반 핀테크 애플리케이션에서 발생하는 백그라운드 작업 부하 불균형 문제를 다룹니다.
- 2 문제 해결을 위해 사용자의 트랜잭션 동기화 작업을 슬롯 스케줄링 방식으로 분산시켜 처리하는 기법을 소개합니다.
- 3 이 방식은 Mersenne Twister와 GCD 메서드를 활용하여 시스템 부하를 평탄화하고 운영 비용을 절감하는 효과를 가져왔습니다.
도입
본 발표는 영국의 핀테크 스타트업 'Cheddar'의 Ulik이 Ruby on Rails 애플리케이션에서 대규모 백그라운드 작업을 효율적으로 관리하는 방법에 대해 설명합니다. Cheddar는 사용자 개인 재무 관리 및 P2P 결제를 지원하며, 23개 은행과의 연동을 통해 사용자 거래 내역을 분석하고 캐시백을 제공합니다. 이 모든 작업은 Rails 모놀리스 아키텍처에서 이루어지며, 특히 은행 거래 동기화 과정에서 발생하는 예측 불가능한 부하 스파이크가 시스템 안정성과 비용 효율성에 큰 문제를 야기했습니다. Ulik은 이러한 문제를 해결하기 위한 '슬롯 스케줄링' 기법과 그 구현 과정을 상세히 소개합니다.
결론
슬롯 스케줄링 도입 결과, 백그라운드 작업 처리량 그래프가 현저히 평탄화되어 시스템 부하가 안정적으로 관리됨을 시각적으로 확인할 수 있었습니다. 이는 컴퓨팅 비용 절감(오토스케일링 인스턴스 불필요한 스핀업 방지), 시스템 반응성 향상, 그리고 향후 필요한 자원량에 대한 정확한 예측을 가능하게 했습니다. 특히, AWS와 같은 클라우드 환경에서 미리 약정된 컴퓨팅 자원을 효율적으로 활용할 수 있게 되어 운영 효율성이 극대화되었습니다. 비록 '점보 사용자'(평균보다 훨씬 많은 자원을 사용하는 사용자)와 같은 예외적인 경우는 별도의 큐나 클러스터로 분리하여 처리할 필요가 있지만, 전반적으로 '단순한' 스케줄링 방식이 가장 비용 효율적이고 효과적인 해결책임을 시뮬레이션을 통해 입증했습니다. 이 발표는 시뮬레이션의 중요성과 통계학적 접근이 시스템 최적화에 얼마나 큰 도움이 되는지를 강조하며 마무리됩니다.