5만 레코드/초 처리: Ruby와 JRuby 이야기

[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년간 성공적으로 운영하며 Ruby의 확장 가능성을 입증했습니다.
  • 2 JRuby는 실제 스레드와 Java 라이브러리 접근을 제공하여 과거 Ruby의 GVL 및 메모리 관리 한계를 극복하고 고성능 시스템 구축을 가능하게 했습니다.
  • 3 최신 C Ruby는 YJIT, Ractors, Concurrent Ruby 등 지속적인 성능 및 동시성 개선을 통해 과거의 단점을 해소하고 있으며, 대다수의 기업에게 Ruby는 여전히 생산성 높은 선택지입니다.

도입

이 강연은 Zendesk의 Christian이 Ruby와 JRuby를 활용하여 초당 5만 레코드를 처리하는 고성능 시스템을 구축한 경험을 공유합니다. 강연자는 "Ruby는 느리다" 또는 "Rails는 확장성이 부족하다"는 오해를 불식시키고자 하며, Ruby가 서비스 개발에 어떻게 활용될 수 있는지, 특히 과거 15-20년 전 Ruby의 전성기와 당시 직면했던 기술적 과제를 중심으로 설명합니다. 이를 통해 Ruby의 발전과 현재의 가능성을 조명합니다.

Ruby의 과거와 확장성 도전

  • 전성기: 15-20년 전 Ruby는 Rails와 함께 Shopify, GitHub, Zendesk 등 혁신 기업 성장을 견인, 웹 애플리케이션의 수평적 확장을 가능케 했습니다.
  • 초기 한계: 과거 메모리 누수와 GVL(Global VM Lock)로 인한 멀티스레딩 제약이 문제였습니다. 2007년 이전 그린 스레드는 I/O 시에도 GVL을 해제하지 않아 성능 저하의 원인이었습니다.

JRuby를 통한 해결책 및 운영 교훈

  • JRuby 도입: Zendesk는 실제 스레드와 Java 라이브러리(언어 감지기, Elasticsearch 클라이언트) 접근을 제공하는 JRuby를 선택, GVL 제약을 극복하고 고성능 ETL 서비스를 구축했습니다.
  • 15년간 성공: JRuby 기반 서비스는 최대 초당 5만 건 업데이트, 일일 6억 건 DB 쿼리를 처리하며 15년간 안정적으로 운영되었습니다.
  • 직면 문제: Java와 Ruby 스타일 혼재(“Juby”), 라이브러리 불일치(YAML 파서 문제), 스레드 안전성 부족으로 인한 학습이 필요했습니다.

Ruby의 미래와 확장성

  • 아키텍처 변화: 마이크로서비스 이점 재평가와 함께 모듈러 모놀리스가 대안으로 제시됩니다. 클라우드, Kubernetes, 이벤트 소싱(Kafka)은 Ruby 애플리케이션 확장성을 크게 향상시켰습니다.
  • C Ruby의 발전: YJIT(CPU 20% 절감), Ractors, Concurrent Ruby 등은 C Ruby의 성능과 동시성을 크게 개선하고 있습니다. Karafka의 동시성 지원은 Ruby 커뮤니티의 성능 개선 노력을 보여줍니다.

결론

강연자는 Ruby의 성능 및 확장성 한계에 대한 대중의 오해가 과장되었음을 강조합니다. 과거 Ruby 1.7이나 Rails 2 시절의 문제점들이 현재까지 이어지는 논쟁은 현실과 동떨어져 있다고 지적합니다. 대부분의 비즈니스는 Twitter와 같은 초거대 규모의 확장성을 요구하지 않으며, Ruby 커뮤니티는 수년간 이러한 문제 해결에 집중하여 많은 발전을 이루었습니다. 궁극적으로는 프로젝트와 팀에 가장 적합한 도구를 선택하는 것이 중요하며, Ruby는 개발자의 행복과 생산성을 극대화하여 훌륭한 소프트웨어를 만드는 데 여전히 강력한 이점을 제공한다고 결론짓습니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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