30만 명이 이용하는 채팅 서비스, Firebase Realtime Database에서 Action Cable로 이전하기

30万人が利用するチャットをFirebase Realtime DatabaseからActionCableへ移行する方法 / Ryosuke Uchida - Kaigi on Rails 2024

3줄 요약

  • 사용자 증가로 인한 채팅 지연 문제 해결을 위해 일본 최대 매칭 앱 'Patto'가 Firebase Realtime Database에서 Ruby on Rails의 Action Cable로 마이그레이션했습니다.
  • Firebase의 리전 제약, 요청 한도 등의 기술적 난관과 복잡한 데이터 이관 과정을 거쳐 Action Cable을 성공적으로 도입하고 서비스 안정화를 이루었습니다.
  • 마이그레이션을 통해 성능 및 사용자 경험을 개선하였으며, 향후 확장 및 운영 유연성을 확보했으나 데이터베이스 활용 및 인프라 비용 효율화 등 추가 개선 과제가 남아있습니다.

본 발표는 30만 명 이상이 사용하는 일본 최대 엔터테인먼트 매칭 애플리케이션 'Patto'에서 채팅 기능의 백엔드를 Firebase Realtime Database에서 Ruby on Rails의 Action Cable로 마이그레이션한 사례를 다룹니다. 서비스 출시 초기, 소규모 개발팀의 빠른 개발과 저비용 운영을 위해 Firebase Realtime Database를 도입하였으나, 서비스 규모가 커지고 특히 메시지 일괄 전송 시 지연이 발생하는 문제가 심화됨에 따라 근본적인 해결책 모색이 필요해졌습니다. 이로 인해 기존 시스템의 한계를 극복하고 안정적인 실시간 통신 기능을 제공하기 위한 마이그레이션 프로젝트가 시작되었습니다.

기존 Firebase Realtime Database 사용에는 여러 가지 제약이 있었습니다. 2017년 도입 당시 유일한 리전이었던 US Central 사용으로 인한 물리적 거리로 레이턴시가 발생했으며, 이는 특히 대량 쓰기 작업 시 성능 저하로 이어졌습니다. 또한, 초당 1000 리퀘스트라는 제한은 병렬 처리에 한계를 야기했습니다. MySQL과 Firebase Realtime Database 두 개의 데이터베이스를 관리하는 데서 오는 복잡성도 문제였습니다. 기술 선택 단계에서는 FireStore, Cloud Pub/Sub, Action Cable 세 가지 대안을 검토했습니다. FireStore는 성능은 우수하나 비용 증가 부담이 있었고, Cloud Pub/Sub은 성능과 비용 면에서 유리했으나 벤더 종속성을 피하고자 했습니다. 최종적으로 Ruby on Rails에 통합되어 있고 프론트엔드 구현이 용이한 Action Cable을 선택했으며, 사례를 만들고 싶다는 의도도 일부 작용했습니다. 마이그레이션 과정에서 가장 큰 난관은 데이터 이관이었습니다. 7년간 운영된 NoSQL 데이터베이스에 어떤 키가 사용되는지 파악하기 어려워, Firebase의 전체 데이터를 BigQuery로 옮겨 분석하는 작업을 선행했습니다. 분석 결과, Firebase와 MySQL 간 데이터 불일치가 확인되었고, 이를 정제하여 이관했습니다. 대규모 talks 테이블에 직접 삽입 시 서비스 중단이 발생할 것을 우려하여, talk_options라는 별도 테이블을 생성하여 데이터를 이관했습니다. Action Cable 구현 후 실제 환경 검증 단계에서 Google Kubernetes Engine(GKE)의 포드 타임아웃 설정(30초)으로 인해 Action Cable 연결이 끊어지고 연속 메시지 전송 시 데이터가 유실되는 문제가 발생했습니다. 이는 재연결 시 누락된 데이터를 재전송하는 방식으로 해결했습니다. 즉시 결제가 이루어지는 선물 기능 역시 연결 문제의 영향을 받았으나, 메시지 전송 자체는 일반 POST 요청으로 처리하고, 응답 파라미터로 결제 성공 여부를 판단한 후 Action Cable을 통해 수신자에게 브로드캐스트하는 방식으로 안정화했습니다. 동시 접속 안정화를 위해 Puma 스레드와 Web Concurrent 워커 수를 늘려 공유 메모리를 효율적으로 사용함으로써 기존과 동일한 사용자 경험을 제공할 수 있게 되었습니다.

이번 Firebase Realtime Database에서 Action Cable로의 마이그레이션 프로젝트를 통해 Patto의 채팅 기능은 사용자 증가에 따른 성능 저하 문제를 해결하고 안정적인 실시간 통신 환경을 구축했습니다. 데이터 이관의 어려움, 인프라 설정 문제, 특정 기능(선물)과의 연동 등 다양한 기술적 난관을 극복하며 프로젝트를 성공적으로 완료했습니다. 이를 통해 비용 효율화와 성능 향상, 그리고 향후 시스템 확장 및 개선을 위한 기반을 마련했습니다. 하지만 MySQL의 기능적 제약(RETURNING 미지원)으로 인한 대량 데이터 처리의 어려움과 스케일링 시 인프라 운영 비용 효율화 등 추가적인 해결 과제가 남아있습니다. 그럼에도 불구하고 Realtime Database의 종속성에서 벗어나 MariaDB로의 전환이나 Action Cable 스탠드얼론화 등 다양한 개선 방안을 모색할 수 있는 유연성을 확보했다는 점에서 큰 의미가 있습니다. 앞으로도 지속적인 개선을 통해 더 나은 서비스를 제공할 준비가 되었습니다.