대규모 플랫폼 안정성 확보

확장 가능한 분산 플랫폼을 운영하려면 고객이 필요할 때 필요한 것을 제공받을 수 있도록 신뢰성을 확보하는 데 전념해야 합니다. 특히 Roblox처럼 규모가 큰 플랫폼의 경우, 종속 관계가 상당히 복잡할 수 있습니다. 신뢰할 수 있는 서비스를 구축한다는 것은, 종속 관계의 복잡성과 상태에 관계없이 특정 서비스가 중단되지 않고(즉, 고가용성), 버그 없이(즉, 고품질) 그리고 오류 없이(즉, 내결함성) 운영된다는 것을 의미합니다.
신뢰성이 중요한 이유
저희 계정 신원(Account Identity) 팀은 구축한 규정 준수 서비스가 플랫폼의 핵심 구성 요소이므로, 더 높은 수준의 신뢰성을 달성하기 위해 최선을 다하고 있습니다. 규정 준수가 제대로 이루어지지 않으면 심각한 결과를 초래할 수 있습니다. 로블록스의 정상적인 운영을 차단하는 데 드는 비용은 매우 높으며, 장애 발생 후 복구에 추가 자원이 필요하고 사용자 경험도 저하됩니다.
일반적인 신뢰성 접근 방식은 주로 가용성에 초점을 맞추지만, 경우에 따라 용어가 혼용되거나 오용되기도 합니다. 대부분의 가용성 측정 기준은 서비스가 가동 중인지 여부만을 평가하는 반면, 분할 내성이나 일관성과 같은 측면은 종종 간과되거나 오해받습니다.
CAP 정리에 따르면, 어떤 분산 시스템도 이 세 가지 측면 중 두 가지만 보장할 수 있으므로, 당사의 규정 준수 서비스는 높은 가용성과 분할 내성을 확보하기 위해 일관성을 일부 희생합니다. 그럼에도 불구하고, 당사의 서비스는 거의 희생하지 않았으며, 아래에서 설명하는 합리적인 아키텍처 변경을 통해 우수한 일관성을 달성하는 메커니즘을 찾아냈습니다.
더 높은 신뢰성을 달성하는 과정은 반복적이며, 사고가 발생하기 전에 결함을 예방, 발견, 탐지 및 수정하기 위해 지속적인 작업과 긴밀하게 연계된 측정이 이루어집니다. 저희 팀은 다음의 실천 방법에서 큰 가치를 확인했습니다:
- 올바른 측정 - 고객에게 품질이 전달되는 방식과 의존성이 우리에게 품질을 제공하는 방식에 대한 포괄적인 가시성을 구축합니다.
- 선제적 예측 - 아키텍처 검토 및 종속성 위험 평가와 같은 활동을 수행합니다.
- 수정 우선순위화 - 당사 서비스와 연결된 서비스 및 종속성에 대한 사고 보고 해결에 더 큰 주의를 기울입니다.
더 높은 신뢰성을 구축하려면 품질 중심의 문화가 필요합니다. 우리 팀은 이미 성과 중심 개발에 투자해 왔으며, 프로세스의 성공이 그 도입 여부에 달려 있음을 잘 알고 있습니다. 팀은 이 프로세스를 전면적으로 도입하고 해당 관행을 표준으로 적용했습니다. 다음 다이어그램은 이 프로세스의 구성 요소를 보여줍니다:

올바른 측정의 힘
지표에 대해 더 깊이 알아보기 전에, 서비스 수준 측정과 관련하여 간단히 설명드릴 내용이 있습니다.
- SLO(서비스 수준 목표)는 우리 팀이 목표로 하는 신뢰성 목표(예: 99.999%)입니다.
- SLI(서비스 수준 지표)는 특정 기간 동안 달성된 신뢰성입니다(예: 지난 2월 99.975%).
- SLA(서비스 수준 계약)는 주어진 기간 동안 제공하기로 합의하고 소비자가 기대하는 신뢰성입니다(예: 주당 99.99%).
SLI는 가용성(처리되지 않거나 누락된 응답 없음), 장애 허용도(서비스 오류 없음), 달성된 품질(예상치 못한 오류 없음)을 반영해야 합니다. 따라서 저희는 SLI를 서비스로 전송된 총 요청 수 대비 성공적인 응답의 “성공 비율”로 정의했습니다. 성공적인 응답이란 정해진 시간과 형식에 맞춰 전송된 요청을 의미하며, 이는 연결, 서비스 또는 예상치 못한 오류가 발생하지 않았음을 뜻합니다.
이 SLI 또는 성공 비율은 소비자(즉, 클라이언트)의 관점에서 수집됩니다. 이는 소비자에게 제공되는 실제 종단 간 경험을 측정하여 SLA가 충족되었다고 확신할 수 있도록 하기 위함입니다. 이를 수행하지 않으면 클라이언트와의 연결에 관련된 모든 인프라 문제를 무시한 채 허위의 신뢰성을 갖게 될 수 있습니다. 소비자 SLI와 유사하게, 잠재적 위험을 추적하기 위해 종속성 SLI도 수집합니다. 실제로 모든 종속성 SLA는 서비스 SLA와 일치해야 하며, 이 둘 사이에는 직접적인 종속 관계가 있습니다. 하나가 실패하면 모두 실패하는 것을 의미합니다. 또한 서비스 자체(즉, 서버)의 메트릭도 추적하고 보고하지만, 이는 높은 신뢰성을 보장하는 실질적인 근거가 되지는 않습니다.
SLI 외에도, 모든 빌드에서는 CI 워크플로우를 통해 보고되는 품질 지표를 수집합니다. 이러한 관행은 품질 게이트(예: 코드 커버리지)를 강력하게 적용하고, 코딩 표준 준수 및 정적 코드 분석과 같은 다른 의미 있는 지표를 보고하는 데 도움이 됩니다. 이 주제는 이전에 '성능 중심의 마이크로서비스 구축'이라는 다른 기사에서 다룬 바 있습니다. 신뢰성을 논할 때 품질을 꼼꼼히 관리하는 것은 큰 의미를 갖습니다. 우수한 점수를 얻기 위해 더 많은 노력을 기울일수록, 불리한 조건에서도 시스템이 실패하지 않을 것이라는 확신이 커지기 때문입니다.
저희 팀에는 두 개의 대시보드가 있습니다. 하나는 소비자 SLI와 종속성 SLI에 대한 모든 가시성을 제공합니다. 다른 하나는 모든 품질 지표를 보여줍니다. 저희는 관심 있는 모든 측면을 통합하고 원하는 기간별로 보고할 수 있도록 모든 내용을 단일 대시보드로 통합하는 작업을 진행 중입니다.
장애 예측
아키텍처 검토는 신뢰성을 확보하는 데 있어 근본적인 요소입니다. 먼저, 중복성이 확보되어 있는지, 그리고 종속 서비스가 중단될 때 해당 서비스가 이를 견뎌낼 수 있는 수단이 마련되어 있는지 확인합니다. 일반적인 복제 방식 외에도, 대부분의 서비스에서는 개선된 이중 캐시 하이드레이션 기법, 이중 복구 전략(예: 로컬 큐 페일오버), 또는 데이터 손실 대응 전략(예: 트랜잭션 지원)을 적용했습니다. 이 주제들은 별도의 블로그 게시물을 할애할 만큼 방대하지만, 궁극적으로 가장 좋은 권장 사항은 재해 시나리오를 고려하면서도 성능 저하를 최소화하는 방안을 구현하는 것입니다.
예상해야 할 또 다른 중요한 측면은 연결성을 향상시킬 수 있는 모든 요소입니다. 즉, 클라이언트에 대해 낮은 지연 시간을 적극적으로 확보하고, 캐시 제어 기법, 사이드카, 그리고 타임아웃, 서킷 브레이커, 재시도에 대한 고성능 정책을 활용하여 매우 높은 트래픽에 대비해야 합니다. 이러한 관행은 HTTP 및 gRPC 환경의 캐시, 스토어, 큐, 상호 의존적인 클라이언트를 포함한 모든 클라이언트에 적용됩니다. 또한 서비스의 정상 신호를 개선하고, 헬스 체크가 모든 컨테이너 오케스트레이션에서 중요한 역할을 한다는 점을 이해해야 함을 의미합니다. 당사의 대부분의 서비스는 헬스 체크 피드백의 일환으로 성능 저하 시 더 나은 신호를 보내며, 정상 신호를 전송하기 전에 모든 중요 구성 요소가 정상적으로 작동하는지 확인합니다.
서비스를 핵심 구성 요소와 비핵심 구성 요소로 세분화하는 것은 가장 중요한 기능에 집중하는 데 유용한 것으로 입증되었습니다. 과거에는 관리자 전용 엔드포인트를 동일한 서비스 내에 두곤 했는데, 비록 사용 빈도는 낮았지만 전체 지연 시간 지표에 영향을 미쳤습니다. 이를 별도의 서비스로 분리하자 모든 지표가 긍정적인 방향으로 개선되었습니다.
의존성 위험 평가(Dependency Risk Assessment)는 의존성과 관련된 잠재적 문제를 식별하는 중요한 도구입니다. 즉, SLI(서비스 수준 지표)가 낮은 의존성을 파악하고 SLA(서비스 수준 계약) 조정을 요청합니다. 이러한 의존성은 통합 단계에서 특별한 주의가 필요하므로, 새로운 의존성이 우리 계획에 충분히 성숙했는지 벤치마킹하고 테스트하는 데 추가 시간을 할애합니다. Roblox Storage-as-a-Service를 조기에 도입한 사례가 좋은 예입니다. 이 서비스와의 통합에는 발견 사항과 피드백을 전달하기 위해 버그 티켓을 등록하고 주기적인 동기화 회의를 진행해야 했습니다. 이 모든 작업에는 “신뢰성(reliability)” 태그가 적용되어, 작업의 출처와 우선순위를 신속하게 파악할 수 있었습니다. 새로운 종속성이 사용 준비가 되었다고 확신할 수 있을 때까지 특성 분석이 빈번하게 이루어졌습니다. 이러한 추가 작업은 공동의 목표를 위해 협력하며, 우리가 제공하고자 하는 신뢰성 수준으로 종속성을 끌어올리는 데 도움이 되었습니다.
혼돈에 질서를 부여하라
사고가 발생하는 것은 결코 바람직하지 않습니다. 하지만 사고가 발생하면, 신뢰성을 높이기 위해 수집하고 배워야 할 의미 있는 정보가 있습니다. 우리 팀은 일반적인 전사적 보고서를 넘어 별도의 팀 사고 보고서를 작성하므로, 영향력의 규모와 관계없이 모든 사고에 집중합니다. 우리는 근본 원인을 규명하고, 향후 이를 완화하기 위한 모든 작업에 우선순위를 부여합니다. 이 보고서의 일환으로, 우리는 다른 팀을 소집하여 우선순위가 높은 종속성 사고를 해결하고, 적절한 해결 방안을 확인하며, 회고하고 우리에게 적용될 수 있는 패턴을 찾습니다.
팀은 서비스별로 월간 신뢰성 보고서를 작성하며, 여기에는 앞서 설명한 모든 SLI, 신뢰성 문제로 인해 생성된 티켓, 해당 서비스와 관련된 모든 잠재적 인시던트가 포함됩니다. 우리는 이러한 보고서 작성에 매우 익숙해져 있어, 다음 단계로 보고서의 자동 추출을 추진 중입니다. 이러한 주기적인 활동을 수행하는 것은 중요하며, 이는 개발 과정에서 신뢰성이 지속적으로 추적되고 고려되고 있음을 상기시켜 줍니다.

당사의 모니터링 시스템에는 맞춤형 지표와 개선된 알림 기능이 포함되어 있어, 알려진 문제나 예상되는 문제가 발생하면 가능한 한 빨리 알림을 받을 수 있습니다. 오탐을 포함한 모든 알림은 매주 검토됩니다. 이 시점에서 모든 문서를 세심하게 다듬는 것이 중요합니다. 그래야 사용자들이 알림이 발동되거나 오류가 발생했을 때 어떤 상황이 예상되는지 파악하고, 모두가 어떻게 대응해야 할지 알 수 있기 때문입니다(예: 대응 매뉴얼과 통합 가이드라인을 일관되게 유지하고 자주 업데이트함).
궁극적으로, 조직 문화에 품질을 정착시키는 것이 더 높은 신뢰성을 달성하는 데 있어 가장 중요하고 결정적인 요소입니다. 우리는 이러한 관행이 일상 업무에 적용되면서 이미 성과를 내고 있음을 확인할 수 있습니다. 우리 팀은 신뢰성에 집착하며, 이는 우리의 가장 중요한 성과입니다. 우리는 잠재적 결함이 미칠 수 있는 영향과 결함이 발생할 수 있는 시점에 대한 인식을 높였습니다. 이러한 관행을 도입한 서비스들은 지속적으로 SLO와 SLA를 달성해 왔습니다. 우리가 수행해 온 모든 작업을 추적하는 데 도움이 되는 신뢰성 보고서는 우리 팀의 노력을 증명하며, 다른 팀에 정보를 제공하고 영향을 미치는 귀중한 교훈으로 자리 잡고 있습니다. 이것이 바로 신뢰성 문화가 우리 플랫폼의 모든 구성 요소에 스며드는 방식입니다.
더 높은 신뢰성을 향한 길은 쉽지 않지만, 사람들이 소통하는 방식을 재구상하는 신뢰할 수 있는 플랫폼을 구축하고자 한다면 반드시 거쳐야 할 과정입니다.
알베르토는 로블록스(Roblox)의 계정 신원(Account Identity) 팀 소속 수석 소프트웨어 엔지니어입니다. 그는 게임 업계에서 오랫동안 활동해 왔으며, 확장성이 뛰어난 아키텍처에 중점을 둔 다수의 AAA급 게임 타이틀과 소셜 미디어 플랫폼 개발에 참여한 경력을 보유하고 있습니다. 현재 그는 모범적인 개발 관행을 적용하여 로블록스가 성장하고 성숙해질 수 있도록 지원하고 있습니다.


