과장된 홍보를 넘어: Veltrix 이벤트를 지탱하는 숨은 영웅
요약
Veltrix의 Treasure Hunt Engine이 겪은 이벤트 기반 아키텍처의 불안정성 문제를 해결하기 위한 기술적 여정을 다룹니다. 리소스 확장 방식의 한계를 깨닫고 Apache Kafka를 도입하여 시스템의 안정성과 확장성을 확보한 사례를 설명합니다.
핵심 포인트
- 단순 리소스 확장(Brute-force)은 시스템 복잡성만 높일 수 있음
- 이벤트 순서 지정 및 충돌 해결을 위한 구조적 접근 필요
- Apache Kafka 도입을 통해 응답 시간 35% 감소 및 처리량 25% 증가
- 병목 현상과 장애 모드에 대한 깊은 이해가 선행되어야 함
우리가 실제로 해결하고 있었던 문제
우리의 보물찾기 엔진 (Treasure Hunt Engine)이 유입되는 플레이어들을 수용하기 위해 확장됨에 따라, 우리는 이벤트 기반 아키텍처 (event-driven architecture)를 재고해야 한다는 것을 알고 있었습니다. 일련의 웹훅 (webhooks)과 API를 중심으로 구축된 이 시스템은 때때로 멈추거나 일관되지 않은 결과를 생성하여, 플레이어들이 진행 상황을 잃거나 답답한 타임아웃 (timeouts)을 경험하게 만들었습니다. 우리 팀은 사용자 대면 인터페이스 (user-facing interface)를 완벽하게 만드는 것과 근본적인 인프라 (infrastructure) 문제를 해결하는 것 사이에서 선택해야 했습니다. 후자보다 전자를 계속 우선시할 수는 없다는 점이 명확했습니다.
우리가 처음에 시도했던 것 (그리고 실패한 이유)
처음에 우리는 더 나은 성능을 위해 무차별 대입 방식 (brute-force)으로 해결하기를 희망하며, 문제에 더 많은 리소스를 투입하기로 결정했습니다. 우리는 워커 노드 (worker nodes)를 확장하고, 스토리지를 업그레이드했으며, 심지어 들어오는 트래픽을 분산시키기 위해 초보적인 수준의 로드 밸런서 (load balancer)를 구현했습니다. 이러한 변화는 일시적으로 일부 압박을 완화해주기는 했지만, 우리의 이벤트 기반 아키텍처 (event-driven architecture)를 더욱 취약하게 만들 뿐이었습니다. 시스템의 복잡성은 계속해서 증가했고, 우리는 그저 시스템을 유지하기 위해 불을 끄는 데 급급한 상황에 처했습니다. 우리는 개별적인 불을 끄는 데 너무 집중한 나머지, 근본적인 숲을 놓치고 있었습니다.
아키텍처 결정
우리는 우리의 이벤트 기반 아키텍처 (event-driven architecture)가 근본적인 결함, 즉 구조화된 충돌 해결 (conflict resolution)의 부재로 인해 고통받고 있다는 것을 깨달았습니다. 여러 이벤트가 동시에 발생할 때마다 시스템은 복잡한 의존성 (dependencies)의 그물에 빠지게 되었고, 특정 작업이 언제 완료될지, 혹은 완료될지 여부를 예측하는 것이 불가능해졌습니다. 우리는 이벤트가 안정적이고 예측 가능한 방식으로 처리될 수 있도록 하는 더 우아한 솔루션이 필요했습니다. 몇 달간의 토론과 실험 끝에, 우리는 이벤트 순서 지정 (event ordering)과 충돌 해결 (conflict resolution)을 처리하기 위해 분산 트랜잭션 관리자 (distributed transaction manager), 구체적으로는 Apache Kafka 프레임워크를 구현하기로 결정했습니다. 이것이 만능 해결책 (silver bullet)은 아니었지만, 우리 시스템을 안정화하기 위한 결정적인 단계였습니다.
수치들이 말해주는 것
Kafka를 통합한 후, 타임아웃 (timeouts)과 행 (hangs) 현상이 현저히 감소했으며, 이에 따라 플레이어들의 불만 사항도 함께 줄어들었습니다. 평균 응답 시간 (average response times)은 35% 감소했고, 시스템 처리량 (throughput)은 25% 증가했습니다. 또한, 긴급 이슈로 인해 팀원들이 호출 (paged)되는 횟수도 눈에 띄게 줄어들었습니다. 이러한 통계 수치들은 명확한 이야기를 들려주었습니다. 우리의 이벤트 기반 아키텍처 (event-driven architecture)는 더 이상 시한폭탄이 아니라, Treasure Hunt Engine을 위한 신뢰할 수 있고 확장 가능한 (scalable) 기반이 되었습니다.
다르게 했을 점
돌이켜보면, 리소스를 확장하기 전에 시스템의 병목 현상 (bottlenecks)과 장애 모드 (failure modes)를 이해하는 데 더 많은 시간을 투자했을 것입니다. 우리는 모니터링 (monitoring)과 로깅 (logging)의 중요성에 대해 자주 듣지만, 실제로 시스템 내의 복잡한 상호작용을 깊이 이해하는 것만큼이나 중요한 일은 없습니다. 또한, 밀접하게 결합된 (tightly coupled) 시스템에서 발생하는 복잡성을 피하기 위해, 메시지 큐 (message queues)를 사용하여 이벤트 생성자 (producers)와 소비자 (consumers)를 분리 (decouple)하는 것과 같은 대안적인 아키텍처를 탐색했을 것입니다.
결국, Veltrix 이벤트와 함께한 우리의 여정은 겸손과 절제의 마스터클래스였습니다. 우리는 완벽함이란 신화이며, 진정한 확장성 (scalability)은 무력 (brute force)이 아니라 근본적인 문제를 해결하는 우아한 솔루션에 있다는 것을 깨달았습니다. 엔지니어로서 우리는 우리가 시스템에 대해 만들어온 서사를 다시 쓰는 한이 있더라도, 시스템의 가혹한 현실에 맞설 의지가 있어야 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기