본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 23. 09:56

보물찾기 엔진의 이벤트 스트리밍(Event Streaming) 선택에서 범했던 실수

요약

게임 엔진의 이벤트 스트리밍 플랫폼 선택 과정에서 Apache Kafka의 지연 시간 문제를 겪고, Apache Pulsar와 Redis 조합으로 전환하여 성능을 개선한 사례를 다룹니다. 시스템 지연 시간을 5초에서 50ms 미만으로 단축하며 확장성과 신뢰성을 확보한 기술적 경험을 공유합니다.

핵심 포인트

  • Kafka의 높은 지연 시간과 파티셔닝 한계로 인한 문제점 분석
  • Apache Pulsar와 Redis 조합을 통한 아키텍처 전환
  • 지연 시간을 5초에서 50ms 미만으로 획기적으로 단축
  • 초당 1,000만 개의 이벤트를 처리하는 확장성 확보
  • 이벤트 스트리밍 플랫폼 선택 시 트레이드오프 이해의 중요성

우리가 실제로 해결하려 했던 문제

지나고 보니, 우리는 단순히 이벤트 처리(Event handling)를 넘어서는 다면적인 문제를 해결하려 노력하고 있었습니다. 플레이어가 오프라인 상태이거나 네트워크 지연(Network latency)을 겪을 때도 게임 상태(Game state)가 항상 최신 상태로 유지되도록 보장해야 했습니다. 또한, 게임 상태를 조작하려는 플레이어를 탐지하고 처벌함으로써 부정행위를 방지해야 했습니다. 게다가 시스템이 수천 명의 동시 접속 플레이어와 초당 수백만 개의 이벤트를 처리할 수 있도록 확장(Scale)할 수 있어야 했습니다. 우리는 이벤트 기반 아키텍처(Event-driven architectures)가 나아가야 할 방향이라는 것을 알고 있었지만, 적절한 이벤트 스트리밍 플랫폼(Event streaming platform)을 선택할 때 수반되는 트레이드오프(Tradeoffs)를 완전히 이해하지 못했습니다.

우리가 처음 시도했던 것 (그리고 실패한 이유)

처음에는 인기도와 강력한 커뮤니티 지원을 고려하여 Apache Kafka를 이벤트 스트리밍 플랫폼으로 선택했습니다. 하지만 곧 높은 지연 시간(High latency)과 제한된 토픽 파티셔닝(Topic partitioning) 기능과 같은 Kafka의 내장된 한계 문제에 부딪혔습니다. 우리 시스템은 지속적으로 5초의 지연(Lag)을 경험했고, 이는 전반적인 게임 경험을 해쳤습니다. 우리는 Kafka의 설정 파라미터(Configuration parameters)를 조정하여 이러한 문제들을 해결해 보려 했지만, 이는 패배가 예정된 싸움이었습니다. 또한, 높은 처리량의 배치 처리(Batch processing)를 처리하지 못하는 Kafka의 능력 부족으로 인해 주기적인 충돌(Crashes) 문제도 겪었습니다.

아키텍처 결정

몇 주간의 시행착오 끝에, 우리는 Apache Pulsar와 Redis의 조합으로 전환하기로 결정했습니다. 우리는 플레이어 업데이트, 게임 상태 변경, 채팅 메시지와 같이 게임의 서로 다른 측면을 위해 여러 개의 이벤트 스트림(Event streams)을 생성했습니다. 이를 통해 각 구성 요소를 디커플링(Decouple)하고 독립적으로 확장할 수 있게 되어 전체 시스템 지연 시간을 줄일 수 있었습니다. 또한 게임 상태를 저장하기 위해 Redis 캐싱 레이어(Caching layer)를 구현하여 데이터베이스의 부하를 줄이고, 이벤트 스트림에서 데이터를 검색하는 데 소요되는 시간을 최소화했습니다.

Redis를 캐싱 레이어 (Caching layer)로 사용함으로써 캐시된 데이터의 생존 시간 (TTL, Time-to-live)을 1초까지 늘릴 수 있었고, 이를 통해 플레이어들이 네트워크 지연 (Network latency)을 겪을 때도 최신 게임 상태를 제공할 수 있었습니다. Apache Pulsar와 Redis로 전환한 후 수치로 나타난 결과는 시스템 지연 시간 (Latency)이 5초에서 50ms 미만으로 크게 감소했다는 것입니다. 우리의 이벤트 스트리밍 (Event streaming) 플랫폼은 초당 1,000만 개의 이벤트를 처리할 수 있었고, Redis 캐싱 레이어는 수백만 개의 게임 상태 레코드를 캐싱할 수 있었습니다. 아마도 더 중요한 점은, 시스템의 신뢰성을 유지하는 데 매우 중요했던 크래시 (Crash)와 다운타임 (Downtime)이 현저히 감소했다는 것입니다.

다르게 했을 점
돌이켜보면, 이벤트 스트리밍 플랫폼을 선택할 때 수반되는 트레이드오프 (Tradeoffs)를 더 잘 이해하기 위해 시간을 투자했을 것입니다. Apache Kafka는 결함 허용 (Fault tolerance) 및 고처리량 배치 처리 (High-throughput batch processing)와 같은 강점이 있지만, 모든 애플리케이션에 최선의 선택은 아닙니다. 또한 Redis로 결정하기 전에 Memcached나 Amazon ElastiCache와 같은 대안적인 캐싱 솔루션도 탐색했을 것입니다. 추가적으로, 높은 처리량의 워크로드 (Workload)를 시뮬레이션하고 다양한 조건에서 이벤트 스트리밍 플랫폼의 성능을 검증할 수 있는 더 강력한 테스트 프레임워크를 구현했을 것입니다. 궁극적으로 이 경험을 통해 얻은 핵심 교훈은 이벤트 기반 아키텍처 (Event-driven architectures)에는 모든 상황에 들어맞는 단 하나의 해결책(One-size-fits-all solution)은 없으며, 각 애플리케이션의 구체적인 요구사항과 제약 사항을 신중하게 고려해야 한다는 것입니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0