Acing Async Ruby: Fiber 기반 동시성으로 Ruby 애플리케이션의 성능을 극대화하는 방법

Bruno Sutic, "Async Ruby"

작성자
EuRuKo
발행일
2025년 01월 13일

핵심 요약

  • 1 Async Ruby는 Fiber 기반의 동시성 모델로, Ruby 3.0의 Fiber Scheduler를 활용하여 I/O 집약적 작업을 효율적으로 처리합니다.
  • 2 수천 개의 동시 작업을 낮은 오버헤드로 관리하며, 기존 스레드 모델의 한계를 극복하고 뛰어난 확장성과 제어 용이성을 제공합니다.
  • 3 웹 크롤러, 스트리밍, API 애플리케이션 등 I/O 바운드 사용 사례에 이상적이며, Rails 환경에서도 안정적으로 운영될 수 있습니다.

도입

본 발표는 Ruby 프로그래밍 언어에서 비동기 I/O 처리를 위한 혁신적인 접근 방식인 Async Ruby에 대해 심층적으로 다룹니다. Bruno Suich는 Async Ruby의 초기 채택자로서, 이 기술이 어떻게 Ruby 애플리케이션의 성능과 확장성을 획기적으로 향상시킬 수 있는지 상세히 설명합니다. 특히 웹 크롤러, 스트리밍 서비스와 같이 I/O 작업이 많은 시나리오에서 Async Ruby가 제공하는 독보적인 이점을 강조하며, 개발자들이 보다 효율적이고 반응성이 뛰어난 애플리케이션을 구축할 수 있도록 돕는 데 초점을 맞춥니다. 이 발표를 통해 청중은 Async Ruby의 핵심 개념과 실제 적용 사례, 그리고 기존 동시성 모델과의 비교를 통해 그 가치를 명확히 이해할 수 있습니다.

Async Ruby는 Ruby 3.0에 도입된 Fiber Scheduler 인터페이스를 활용하는 Fiber 기반 동시성 모델입니다. 이는 Node.js 등에서 인기를 얻은 경량 I/O 동시성 패러다임을 Ruby에 적용한 것으로, Samuel Williams가 주요 개발을 담당했습니다.

Ruby의 기존 동시성 모델(다중 프로세스, Ractors, 스레드)과 비교하여, Async Ruby는 Global Interpreter Lock(GIL) 제약을 받지만, 운영체제 스레드 호출 없이 Ruby 소스 코드 내에서 생성 및 전환되는 Fiber를 사용합니다. 이로 인해 Fiber는 스레드보다 가볍고 빠르며, 수천 개 이상의 동시성을 효율적으로 처리합니다. async 젬은 사용자 인터페이스를, io-event 젬은 Fiber Scheduler의 핵심 로직을 구현합니다. Fiber Scheduler 덕분에 Async Ruby는 기존 동기적 Ruby 코드 스타일을 유지하는 ‘색깔 없는(colorless)’ 비동기 프로그래밍을 지원합니다.

발표는 Async Ruby의 실용적 활용법을 예시로 보여줍니다. Async 블록과 Async::Task로 여러 I/O 작업을 병렬 실행하여 실행 시간을 단축하는 기본 예시를 제시합니다. 또한, Async::Barrier로 다수 API 중 최단 응답을 취하고, Async::Semaphore로 동시 요청 수를 제한하는 등 Async 태스크의 정교한 제어를 시연합니다.

특히, HTTP, Redis, PostgreSQL, 시스템 프로세스 호출 등 다양한 I/O 작업을 5000개 동시에 실행하면서도 async-http (HTTP/2 지원)를 통해 전체 실행 시간을 8초 미만으로 유지하는 놀라운 확장성을 입증합니다. 이는 Async Ruby가 대규모 I/O 집약적 워크로드에 매우 적합함을 보여줍니다.

Async Ruby는 스레드와 달리 I/O 바운드 작업에 훨씬 유리합니다. 스레드는 높은 오버헤드와 GIL 제약, 복잡한 동기화 문제로 CPU 집약적 작업에 적합한 반면, Async Ruby의 Fiber는 낮은 오버헤드, 높은 동시성(수백만 개), 협력적 스케줄링, 뛰어난 제어 용이성을 제공하여 I/O 바운드 작업에 효율적입니다.

이상적인 사용 사례는 웹 크롤러, 채팅 앱, 스트리밍, 웹 소켓, I/O 및 네트워크 요청이 많은 API 전용 애플리케이션 등입니다. 기존 Sidekiq 잡이나 Puma 내 Rails 컨트롤러에서도 Async Ruby를 활용해 I/O 작업을 가속화할 수 있어, 스레드와 상호 보완적으로 사용 가능합니다. Async Ruby는 Rails와 호환되며, 프로덕션 환경에서 안정적으로 운영됩니다.

결론

결론적으로, Async Ruby는 Ruby 생태계에서 I/O 집약적인 작업을 처리하는 데 있어 매우 강력하고 현대적인 솔루션입니다. Fiber 기반의 낮은 오버헤드와 뛰어난 동시성, 그리고 '색깔 없는' 코드 작성 방식은 개발자들에게 큰 이점을 제공합니다. 스레드와는 다른 강점을 가지며, 특히 웹 크롤링, 실시간 통신, 대규모 API 호출과 같은 I/O 바운드 시나리오에서 압도적인 성능 향상을 가져올 수 있습니다. 비록 스레드처럼 CPU 집약적 작업에 최적화되지는 않았지만, I/O 중심의 현대적 웹 애플리케이션 구축에 있어 Async Ruby는 Ruby 개발자들이 반드시 고려해야 할 핵심 도구입니다. 이 기술은 Ruby의 활용 범위를 넓히고, 더욱 효율적이고 확장 가능한 시스템을 구축할 수 있도록 지원합니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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