这个项目能做什么
Fila 是一个目前处于设计阶段(尚无可用代码)的消息代理。它解决了传统 FIFO 代理的一个常见问题:当多个租户或工作负载类型共享一个队列时,单个嘈杂的生产者可能饿死其他所有消费者,而限流通常被推给消费者,浪费工作并增加延迟。
Fila 将调度决策移入代理本身。核心特性包括:
- **赤字轮询(DRR)公平调度**:每个公平性 key 根据权重获得相应比例的投递带宽,防止租户饥饿。
- **消费者声明的限流**:消费者在订阅时声明命名速率限制(例如按服务或按客户)。代理会暂缓消息,直到投递保持在所有声明的限制之内,因此消费者只会收到它们实际能够处理的消息。
- **Lua 规则引擎**:可选的 `on_enqueue` 和 `on_failure` 钩子允许用户定义自定义调度策略,例如从负载中派生公平性 key,或决定重试还是进入死信。
- **去重与排序**:两者默认关闭,分别可通过幂等键和排序键进行配置。
- **重试与死信队列**:失败的尝试会触发可配置的重试策略(默认 3 次尝试,采用指数退避),耗尽的消息会移动到每队列的 DLQ,支持重新投递。
- **租约**:已投递的消息带有可见性超时的租约;过期的租约计为失败尝试。
- **运行时配置**:一个可从 Lua 钩子读取的实时键值存储,允许在不重启的情况下更改策略。
客户端 SDK 使用 Rust 编写,采用基于能力的权限模型,包含三个句柄(生产者、消费者、管理员),与 ACL 权限相对应。线协议是手工编写的二进制协议(不使用 gRPC),原生支持批处理,并在单个连接上多路复用。客户端遵循 sans-io 架构,将纯状态机核心与语言特定的 I/O 外壳分离,以便未来支持多语言 SDK。
CLI(`fila`)是基于同一 SDK 的薄客户端,没有特权访问,涵盖队列管理、集群操作(排空、移动、再平衡)、运行时配置、重新投递以及认证/ACL 管理。
存储从仅追加日志和内存索引开始,存储 trait 契约强调确认前持久化、原子变更组和有序范围扫描。集群使用每队列的 Raft 组,并有一个元组用于协调。
采用 AGPLv3 许可。
评论
0 人表达喜爱 · 满10人后显示 Deer Point
登录后参与讨论。