프로젝트 소개

Fila는 현재 설계 단계에 있는 메시지 브로커입니다(아직 동작하는 코드는 아님). 이는 전통적인 FIFO 브로커의 흔한 문제를 해결합니다. 여러 테넌트나 워크로드 유형이 하나의 큐를 공유할 때, 하나의 시끄러운 프로듀서가 다른 모든 이를 굶길 수 있고, 속도 제한은 보통 컨슈머로 밀려나 작업을 낭비하고 지연을 추가합니다. Fila는 스케줄링 결정을 브로커 자체로 옮깁니다. 핵심 기능은 다음과 같습니다: - **Deficit Round Robin(DRR) 공정 스케줄링**: 각 공정성 키는 가중치에 따라 전달 대역폭의 비례 몫을 받아 테넌트 굶김을 방지합니다. - **컨슈머 선언 스로틀링**: 컨슈머는 구독할 때 명명된 속도 제한(예: 서비스별 또는 고객별)을 선언합니다. 브로커는 전달이 모든 선언된 제한 내에 유지될 때까지 메시지를 보류하므로, 컨슈머는 실제로 처리할 수 있는 메시지만 받습니다. - **Lua 규칙 엔진**: 선택적 `on_enqueue` 및 `on_failure` 훅을 통해 사용자가 페이로드에서 공정성 키를 도출하거나 재시도 대 데드레터 동작을 결정하는 등 사용자 정의 스케줄링 정책을 정의할 수 있습니다. - **중복 제거 및 순서 보장**: 둘 다 기본적으로 꺼져 있으며, 각각 멱등성 키와 순서 키로 구성할 수 있습니다. - **재시도 및 데드레터 큐**: 실패한 시도는 구성 가능한 재시도 정책(기본 3회 시도, 지수 백오프)을 트리거하며, 소진된 메시지는 재드라이브를 지원하는 큐별 DLQ로 이동합니다. - **리스**: 전달된 메시지는 가시성 타임아웃과 함께 리스되며, 만료된 리스는 실패한 시도로 간주됩니다. - **런타임 구성**: Lua 훅에서 읽을 수 있는 라이브 키-값 저장소로, 재시작 없이 정책을 변경할 수 있습니다. 클라이언트 SDK는 Rust로 작성되었으며 ACL 권한을 반영하는 세 가지 핸들(프로듀서, 컨슈머, 관리자)을 가진 기능 기반 권한 모델을 사용합니다. 와이어 프로토콜은 직접 구현한 바이너리 프로토콜(gRPC 아님)로, 배치 네이티브이며 단일 연결 위에서 다중화됩니다. 클라이언트는 sans-io 아키텍처를 따르며, 순수 상태 머신 코어를 언어별 I/O 셸과 분리하여 향후 다국어 SDK를 가능하게 합니다. CLI(`fila`)는 동일한 SDK 위의 얇은 클라이언트로 특별한 접근 권한이 없으며, 큐 관리, 클러스터 작업(drain, move, rebalance), 런타임 구성, 재드라이브, 인증/ACL 관리를 다룹니다. 스토리지는 append-only 로그와 인메모리 인덱스로 시작하며, 스토리지 트레이트 계약은 승인 전 내구성, 원자적 변경 그룹, 순서 있는 범위 스캔을 강조합니다. 클러스터링은 큐별 Raft 그룹과 조정을 위한 메타 그룹을 사용합니다. AGPLv3에 따라 라이선스됩니다.