20. 🌟 Funboost 核心设计思想
📖 本章从架构哲学层面总结 funboost 的设计理念,帮助读者理解框架的定位、取舍和边界。具体用法见各教程章节。
20.1 🗽 函数至上,零侵入
核心命题:业务函数是核心资产,框架的职责是为函数赋能,而非约束函数。
from funboost import boost, BoosterParams, BrokerEnum
@boost(BoosterParams(queue_name='calc_queue', broker_kind=BrokerEnum.REDIS, qps=10))
def calculate_data(x, y):
return x + y
# 本地直调(@boost 不改变函数行为)
result = calculate_data(1, 2) # → 3
# 分布式发布
calculate_data.push(1, 2)
# 启动消费
calculate_data.consume()
门面一体:一个 @boost 对象同时具备本地调用、发布(fun.push(x, y))、消费、队列运维全部能力。去掉 @boost 装饰器,函数退化为普通函数——框架零侵入、可拆卸。上下文走 fct.task_id 而非 bind=True 侵入签名。
20.2 🏛️ 去中心化:无全局 app,import 即注册
🏷️ |
🐢 Celery 集权式 |
✨ funboost 联邦式 |
|---|---|---|
中心对象 |
全局 |
无——每个 |
注册机制 |
|
|
路由配置 |
|
队列名在装饰器参数中声明 |
启动 |
命令行 |
|
新增函数 |
修改 |
写新文件 + import + 启动 |
架构选择理由:去中心化消除了「函数→app→目录结构强制」的连锁约束。消费函数写在任意深层级文件夹下都行,不强制目录范式、不绑定固定工程脚手架。
20.3 🔌 万物皆可 Broker:直连 + 短调用链
funboost 内置 53 种 broker_kind,并支持 register_custom_broker() 注册自定义实现。
20.3.1 🌐 远超"多支持几种MQ"
🏷️ 类别 |
📝 代表 |
|---|---|
🏆 主流 MQ |
RabbitMQ, Kafka, RocketMQ, NATS, Pulsar, NSQ, MQTT, SQS |
🔴 Redis 系列 |
REDIS, REDIS_ACK_ABLE, REDIS_STREAM, REDIS_ZSET_DELAY |
💾 数据库 |
MongoDB, PostgreSQL, MySQL(SQLAlchemy), SQLite |
🔌 网络协议 |
TCP, UDP, HTTP, gRPC, WebSocket |
🔮 事件驱动 |
MYSQL_CDC(Binlog 变更即消息), WATCHDOG(文件变更即消息) |
🦖 框架集成 |
Celery, Dramatiq, Huey, RQ, Kombu 皆可作为 funboost 的底层驱动 |
🧠 同进程 |
|
💡 范式升维:传统队列是"有人 push 才执行";funboost 通过 CDC/Watchdog/Socket 等,把"世界发生变化"直接变成可调度事件——从消息驱动走向事件驱动。
20.3.2 ⚡ 为什么不用 Kombu 统一抽象
Celery 通过 Kombu 提供统一 MQ 抽象,代价是多层转换损耗 + 绑死 Kombu 支持范围。funboost 选择直接操作各 MQ 原生三方包:
从取消息到执行函数仅 3 层调用(
_dispatch_task→_submit_task→_run→ 用户函数)新增 Broker 只需实现
_dispatch_task和少量钩子,不需要写 Kombu adapter自研
FlexibleThreadPool(有界队列背压 + 空闲缩容 + 按需扩容)与短调用链紧密配合

20.4 📦 纯 JSON 消息 + 执行模型透明
funboost 的消息体是开发者发布的原始参数 JSON(加 task_id/publish_time 等少量元数据),不包含 Python 模块路径、类名等框架私有信息。
执行模型的本质:fun(**消息字典) ——消费就是把消息体解包为关键字参数调用用户函数。
因此:
非 funboost 发布的消息也能被消费(
_user_convert_msg_before_run清洗管道)Java/Go 等异构系统可直接往队列写 JSON 触发 Python 函数
Canal/Debezium/Flink CDC 的 binlog 消息无需适配即可消费
funboost 也能作为万能发布者——对 53 种队列发送不带任何框架协议的原始消息
20.5 🛡️ 声明式控制 + OOP 扩展
第一层:声明意图
开发者通过 BoosterParams(Pydantic 模型,IDE 全补全)声明"想要什么",框架负责"怎么实现"。30+ 种控制能力全部收束于参数模型,拒绝 *args/**kwargs 黑盒:
QPS 控频 · 分布式全局控频 · 心跳 ACK · 重试(基础/指数退避)· 死信队列 · 优先级 · 延时 · 任务过滤 · 函数超时 · 远程 Kill · 暂停/恢复 · RPC · 消息过期 · 结果持久化 · 定时 · 多进程 · ...
第二层:经典 OOP 无限定制
当内置行为不满足需求时,用户通过继承重写 Consumer/Publisher 任意方法(self.xxx 访问所有属性,100% 可定制)。
对比 Celery 只能用预留的 Signals 钩子网——没暴露 hook 就无法扩展。funboost 用子类化与组合替代散点事件列表。
已有 Mixin:熔断器、微批消费、Prometheus、OpenTelemetry、周期额度、告警通知。
20.6 🌐 PyPI 即生态:拒绝封闭插件宇宙
核心立场:funboost 不发明 Middleware/Pipeline/Extension 等"只有框架形态才能进场"的墙。
业务函数体内 import 任意 PyPI 三方包(Playwright、httpx、Pandas、TensorFlow...),零适配成本——因为 funboost 调度的是函数本身,不限制函数内部做什么。
💡 funboost 认为 PyPI 海量三方包就是最大的"插件生态",框架不应该在用户和 PyPI 之间竖一道墙。
20.7 🚀 从任务队列到 FaaS 平台
设计取舍:传统任务队列的边界止于"接收消息并执行";funboost 选择向上延伸——管理面与执行面解耦(Web 端通过 Redis 元数据动态发现消费函数,无需共享代码),让同一套 @boost 函数既能异步消费、也能被 HTTP 同步调用。
funboost 自我定位不是"后台 Worker",而是可私有化部署的函数计算平台 + 轻量 DevOps 系统(详见 c13 funweb、c15 FaaS 章节)。
20.8 🧠 定位:通用函数调度平台
funboost 调度的是函数逻辑,而非某种特定的请求类型。
🏷️ 场景 |
📝 说明 |
|---|---|
🤖 AI 推理 |
GPU 任务排队、QPS 限速保护 API |
📊 数据处理 |
ETL 流水线、报表生成 |
📧 通知服务 |
邮件/短信/推送异步发送 |
🕷️ 分布式爬虫 |
配合 |
📈 量化交易 |
行情事件驱动 + 严格控频下单 |
🔄 CDC 事件 |
MYSQL_CDC Broker 监听 Binlog 变更触发处理 |
☁️ FaaS |
通过 HTTP 接口暴露任意函数为微服务 |
20.9 👑 总结
funboost 将 消息队列、任务调度、函数即服务、分布式控频、并发池、RPC 等复杂分布式能力,统一封装为一个 @boost 装饰器。
✅ 核心价值 |
📝 一句话 |
|---|---|
🎯 极简 |
一个装饰器上手,无八股配置,无中心 app |
💪 极强 |
53 种 Broker,多进程叠加并发,30+ 种任务控制功能 |
🛡️ 极稳 |
心跳 ACK,进程崩溃秒级回收孤儿消息 |
⚡ 极快 |
从取消息到执行函数仅 3 层调用 + 自研高性能并发池 |
💡 极友好 |
Pydantic 配置全部 IDE 可补全,拒绝黑盒 |
🔓 极自由 |
零目录约束,纯 JSON 跨语言,PyPI 即生态 |
🌐 极开放 |
事件驱动、CDC、跨语言——不只是"Python 任务队列" |