Ruby 및 JRuby를 활용한 고성능 데이터 처리: 초당 5만 레코드 달성기

[EN] 50.000 processed records per second: a CRuby & JRuby story / Cristian Planas @cristian_planas

작성자
RubyKaigi
발행일
2025년 05월 27일

핵심 요약

  • 1 Zendesk는 Ruby의 고성능 데이터 처리 한계를 극복하기 위해 JRuby를 활용, 초당 5만 레코드 처리가 가능한 ETL 마이크로서비스를 15년간 성공적으로 운영했습니다.
  • 2 JRuby는 실제 스레드와 Java 라이브러리 접근을 통해 확장성을 제공했으나, 코드 스타일 및 라이브러리 호환성 문제가 있었습니다.
  • 3 현재 CRuby는 YJIT, Ractors 등 성능 개선을 통해 고성능 애플리케이션 개발에 더욱 적합해졌으며, Ruby의 확장성 논란은 과장된 측면이 있습니다.

도입

발표자는 Ruby의 성능 및 확장성 논란에 대한 대중적 오해를 불식시키고자 합니다. Zendesk에서 Ruby 및 JRuby를 활용하여 초당 5만 건의 레코드를 처리하는 ETL(Extract, Transform, Load) 마이크로서비스를 15년간 성공적으로 운영한 사례를 공유하며, Ruby가 고성능 환경에서도 충분히 효과적으로 활용될 수 있음을 입증합니다.

과거 15-20년 전, Ruby는 가독성과 표현력으로 소프트웨어 개발에 혁명을 가져오며 Shopify, GitHub 등 여러 기업의 성장을 견인했습니다. 초기 Ruby는 웹 애플리케이션 수평 확장에 강했지만, GVL(Global Interpreter Lock)로 인한 멀티스레딩 제약으로 대량 데이터 처리(ETL) 같은 고성능 작업에는 한계가 있었습니다. Zendesk는 기존 Ruby 코드베이스를 유지하며 초당 5만 레코드의 높은 처리량을 목표로 ETL 서비스를 구축했고, 이를 위해 JRuby를 도입했습니다. JRuby는 JVM 위에서 실행되어 실제 스레드를 지원하며 GVL 영향을 받지 않았고, Java 라이브러리 활용도 가능하게 했습니다.

15년간 JRuby 기반 ETL 서비스를 운영하며 Zendesk는 몇 가지 교훈을 얻었습니다. Ruby와 Java 코드 스타일 통합의 어려움, JRuby/CRuby 간 라이브러리 호환성 문제(예: YAML 파서), 그리고 초기 Ruby 라이브러리의 스레드 안전성 부족이 주요 도전 과제였습니다. 이를 통해 스레드 안전한 Ruby 코드 작성의 중요성을 깨달았습니다.

현대 소프트웨어 개발에서 Ruby의 확장성 논의는 변화했습니다. 클라우드와 Kubernetes의 발전이 인프라 수준에서 확장성 문제를 크게 완화했으며, Kafka, Maxwell 같은 이벤트 소싱 기술은 데이터베이스 부하를 줄이고 효율적인 배치 처리를 가능하게 합니다. 가장 고무적인 변화는 CRuby 자체의 성능 향상입니다. YJIT 도입으로 Zendesk는 CPU 사용량을 20% 절감했고, Concurrent Ruby와 미래의 Ractors는 Ruby의 동시성 프로그래밍을 발전시킬 잠재력을 가집니다. 최신 Ruby 라이브러리들도 동시성을 적극 지원하며 커뮤니티의 성능 개선 노력을 보여줍니다.

결론

결론적으로, Ruby의 성능 및 확장성 한계에 대한 대중적 인식은 과거에 머물러 있으며 과장된 측면이 있습니다. 대부분의 기업에게는 초거대 규모의 확장성 문제가 해당되지 않습니다. Ruby 커뮤니티는 수년간 성능과 동시성 문제를 해결해왔으며, 현재 Ruby는 훨씬 빠르고 동시성에 친화적입니다. 궁극적으로, 프로젝트와 팀 생산성에 가장 적합한 도구를 선택하는 것이 중요하며, Ruby는 "프로그래머를 행복하게 만들기 위해 설계되었다"는 철학처럼 개발 생산성 측면에서 독보적인 강점을 지닙니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!