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와 호환되며, 프로덕션 환경에서 안정적으로 운영됩니다.