Samuel Williams의 async
gem은 콜백이나 복잡한 스레딩 없이 파이버(Fibers)를 통해 Ruby에 경량 동시성을 제공합니다. 파이버는 I/O 작업 시 자동으로 제어권을 양보하여 수동 조정 없이 동시 실행을 가능하게 합니다.
경량 동시성의 이점
파이버는 킬로바이트 단위의 메모리 사용, 협력적 스케줄링, 친숙한 프로그래밍 모델, 자동 I/O 양보를 통해 기존 스레딩의 단점을 극복하고 효율성을 높입니다.
WaterDrop과 Async의 투명한 통합
WaterDrop
2.8.7부터 #produce_sync
및 #produce_many_sync
작업은 async
블록 내에서 Kafka I/O 시 자동으로 제어를 양보합니다. 개발자는 Async do |task| ... end
블록 내에서 task.async
를 사용하여 여러 I/O 작업을 동시에 실행할 수 있으며, 별도 설정 없이 async
환경에서 동시성을 활용합니다.
실제 성능 향상
10,000개 Kafka 메시지 처리 벤치마크에서 async
파이버는 상당한 성능 향상을 입증했습니다. 최적화된 파이버 동시성으로 796 메시지/초(기준 대비 5.0배 개선)를 달성했으며, 이는 다중 프로듀서 방식(4.1배 개선)보다 적은 메모리로 더 높은 성능입니다. 이는 Ruby가 동시 I/O를 효율적이고 우아하게 처리할 수 있음을 보여줍니다.
트랜잭션 처리
하나의 프로듀서에서 여러 트랜잭션은 transactional.id
제약으로 순차적이지만, 트랜잭션 중 I/O 발생 시 제어를 양보하여 다른 파이버의 작업을 허용합니다. 동시 트랜잭션에는 별도 프로듀서 사용이 권장됩니다.