Falcon의 핵심 기술 및 Rails 통합
Falcon은 Ruby의 동시성을 혁신하기 위해 설계된 웹 서버로, Async 프레임워크와 IO event Gem을 기반으로 합니다. 특히, FiberScheduler 인터페이스를 활용하여 Fiber의 실행을 효율적으로 관리하며, 요청당 하나의 Fiber를 사용하는 모델을 통해 이벤트 루프 디자인의 확장성을 극대화합니다.
Rails 애플리케이션 구축
1. 기본 설정 및 HTTP/2 지원
-
새로운 Rails 프로젝트에서 Puma 대신 Falcon을 사용하도록 전환합니다.
-
falcon serve명령은 기본적으로 HTTP/2와 TLS를 지원하며,localhostGem을 통해 로컬 개발 환경에서 자체 서명된 인증서를 쉽게 설치하여 HTTPS 개발 환경을 구축할 수 있습니다. -
Falcon은 Rack 호환 서버 중 유일하게 HTTP/2 및 TLS를 기본으로 제공하여 최신 웹 애플리케이션 개발에 최적화되어 있습니다.
2. Active Record 지원
-
Falcon은 데이터베이스 쿼리를 포함한 비블로킹 I/O에 매우 효율적입니다.
-
Rails 8에서는
config.active_record.async_query_isolation = :fiber설정을 통해 Fiber당 요청 격리를 보장하여, 각 요청이 고유한 데이터베이스 연결을 사용하도록 하여 동시성 환경에서의 안정성을 확보합니다. -
이를 통해 Falcon은 Active Record와 함께 높은 처리량을 제공하며, 동일한 하드웨어 리소스에서 Puma 대비 200% 이상의 처리량 개선을 시연했습니다.
3. Active Job 및 Async Job
-
기존의 Active Job 러너(Solid Queue, Sidekiq)는 Async를 인식하지 못하여 I/O 발생 시 동시성 제한이 발생할 수 있습니다.
-
Async JobGem은 백그라운드 작업의 동시성을 높이기 위해 개발되었습니다. 이는 Redis 또는 인메모리 큐를 사용하여 작업 데이터를 직렬화하고 실행하며, 기존 어댑터와 달리 래퍼 없이 Active Job을 직접 호출하여 오버헤드를 줄입니다. -
active_async_job_adapterGem을 설치하고 Rails 설정에서 큐 어댑터를 정의하여 사용할 수 있습니다.
4. Action Cable 및 Async Cable
-
Action Cable은 HTTP 1.1만 지원하지만, Falcon은 기본적으로 HTTP/2를 사용합니다.
-
Async CableGem은 Action Cable의 구현을 Async WebSocket으로 대체하여 HTTP 1.1과 HTTP/2를 모두 지원하며, 기존 Action Cable보다 2배 이상의 메시징 속도를 제공하여 호환성과 성능을 개선합니다.
5. 실시간 양방향 스트리밍
-
Rack 3의 주요 기능인 실시간 양방향 스트리밍을 활용하여 순서가 보장된 메시지 전달이 가능합니다.
-
서버 측 렌더링을 통해 브라우저에서 Flappy Bird와 같은 대화형 게임을 실행하는 데모를 통해 Falcon의 강력한 실시간 스트리밍 지원 능력을 시연했습니다.
애플리케이션 배포
1. Falcon Host
-
개발 시
falcon serve대신 프로덕션 배포를 위해falcon host명령을 사용합니다. 이는Falcon.rb서비스 구성 파일을 읽어 애플리케이션 실행 방식을 정의합니다. -
Falcon.rb파일은 Rack 및 Let’s Encrypt TLS 환경을 포함하여 표준 Rails 애플리케이션 배포에 필요한 기본 구성을 제공합니다. -
단일
Falcon.rb파일 내에서 웹 애플리케이션과 백그라운드 작업 서비스를 통합하여 배포를 간소화할 수 있습니다.
2. 가상 호스팅 및 시스템 통합
-
falcon virtual명령을 사용하여 단일 서버에서 여러Falcon.rb서비스 파일을 실행하고, HTTP 및 HTTPS 엔드포인트를 모두 바인딩하여 가상 호스팅을 구현할 수 있습니다. -
Systemd의
type=notify프로토콜을 지원하여 시스템 서비스 프레임워크와 직접 통합되며, Kubernetes 환경에서는 로그 파일을 통한 Readiness Probe 통신을 지원합니다.
애플리케이션 모니터링
1. 자동 헬스 체크 및 슈퍼바이저
-
Async 컨테이너는 자식 프로세스의 헬스 체크를 자동으로 수행하여 애플리케이션이 중단되거나 이벤트 루프가 정체될 경우 프로세스를 강제로 재시작합니다.
-
슈퍼바이저 서비스는 웹 애플리케이션과 함께 실행되며, 메모리 사용량 모니터링 및 메모리 누수 감지와 같은 다양한 기능을 수행할 수 있습니다. 메모리 제한을 설정하여 애플리케이션 안정성을 확보합니다.
2. Traces Gem
-
TracesGem은 애플리케이션 실행 추적을 통해 성능을 측정하고 다양한 작업의 지연 시간을 모니터링하는 데 유용합니다. -
기존 코드에 최소한의 오버헤드로 계측 기능을 추가할 수 있는 인터페이스를 제공하며, W3C 추적 사양에 따른 분산 트레이싱을 지원합니다. OpenTelemetry 백엔드도 제공됩니다.
3. Metrics Gem
-
MetricsGem은 카운트, 지속 시간, 크기 등 고빈도 이벤트를 집계하여 효율적으로 저장하고 시각화하는 데 사용됩니다. -
Traces Gem과 유사한 인터페이스를 제공하며, 애플리케이션의 상태를 추적하고 오류 조건을 감지하는 데 유용합니다.
4. Console Gem (통합 로깅)
-
ConsoleGem은 여러 어댑터와 출력을 지원하는 간단한 로깅 인터페이스를 제공합니다. -
주제 기반 로그 형식과 구조화된 데이터 포함을 지원하며, 출력 래퍼를 추가하여 로그 메시지를 풍부하게 하거나 수정할 수 있습니다. DataDog 트레이스 컨텍스트 기반의 로그 상관관계 기능을 통해 디버깅 효율성을 높일 수 있습니다.
간소화된 개발 경험
-
Falcon RailsGem은 Falcon, localhost, Async Job, Async Cable, Traces, Metrics, Console 등 오늘 논의된 많은 기능을 기본적으로 포함하여 설정을 간소화합니다. -
Agent ContextGem은 AI 에이전트가 참조할 수 있는 문서를 프로젝트에 복사하여, 개발자가 AI 에이전트에게 Falcon을 사용하도록 애플리케이션을 업데이트하라고 지시할 수 있게 합니다. 이는 Ruby 개발을 더욱 쉽고 재미있게 만듭니다.