去年有个做SaaS的朋友跟我吐槽:公司20人,数据需求堆成山,招了个数据工程师,三个月过去连数仓影子都没见着。我让他试试FastAPI+PostgreSQL+dbt这套组合,他周末加班两天,周一演示时老板以为他请了外包团队。
这套方案最近在技术圈传得有点开。不是因为它多"先进",恰恰相反——它把本该复杂的事,用现有工具拼出了极简路径。
为什么选这三个工具:不是最强,是最省
FastAPI(高性能Python Web框架)负责对外接口,PostgreSQL(开源关系型数据库)同时扛事务和分析,dbt(数据转换工具)管数仓建模。三样东西都是开源的,学习曲线比Snowflake+Airflow+Fivetran那套商业方案平缓得多。
传统做法要拆两套系统:OLTP(在线事务处理)用MySQL扛实时订单,OLAP(在线分析处理)用ClickHouse或Snowflake做报表,中间靠Kafka或Airflow同步。数据延迟半小时起步,工程师还得维护两套Schema。
这套方案的核心赌法是:PostgreSQL 14之后的版本,分析能力已经够用了。
我用pgbench测过一个场景:单表5000万行,聚合查询带窗口函数,PG14的并行查询能把时间压到秒级。对于日活百万以内的产品,事务和分析共用一套PG实例,省掉的同步链路足够抵消性能损耗。
FastAPI的角色是"胶水"。它的异步特性(AsyncIO)能同时处理高并发API请求和批量数据写入,Pydantic模型(数据验证库)直接对接PG的JSONB字段,省了一层ORM(对象关系映射)的转换开销。
dbt的隐藏用法:把SQL变成可版本控制的代码
很多人把dbt当"SQL调度器"用,其实它解决的是数据团队最大的痛点:文档和测试的自动化。
你写了一个复杂的用户留存计算SQL,嵌套四层CTE(公用表表达式)。三个月后自己再看,或者同事接手,基本等于重新写一遍。dbt的schema.yml强制你定义每个模型的输入输出、字段含义、唯一性约束,Git提交时自动跑测试。
更实用的是它的增量模型(Incremental Model)。原始事件表每天新增百万行,全量重跑要两小时,改成增量后只处理当天数据,dbt自动维护`updated_at`时间戳和分区策略。
有个细节:dbt的宏(Macro)系统能让你把业务逻辑抽象成可复用函数。比如计算"7日留存"的SQL,在三个报表里用了三种写法,用宏统一后,指标口径变更改一处就行。这对防止"同名不同义"的数据灾难很有效。
全栈部署:Docker Compose一键启动,但生产环境有坑
本地开发用Docker Compose把FastAPI、PG、dbt打包,新人入职半小时能跑通全流程。但到了生产环境,三个地方容易栽跟头。
第一是PG的连接池。FastAPI的异步worker默认开几十个,每个都占一个PG连接,很快把`max_connections`打满。解决方案是用Pgbouncer(连接池中间件)做事务级连接池,或者换异步PG驱动`asyncpg`配合连接池管理。
第二是dbt的执行时机。很多人用crontab定时跑dbt,但dbt本身不管任务依赖。如果上游表还没生成,下游模型会读到空数据或旧数据。轻量方案是用Prefect(工作流编排工具)或Dagster替代,重一点直接上Airflow。
第三是分析查询拖慢事务。PG的`max_parallel_workers_per_gather`参数调太高,大查询会抢光CPU,导致支付接口超时。我的做法是用PG的逻辑复制(Logical Replication)把分析负载分流到只读副本,主库只扛事务。
真实成本对比:3天 vs 3个月的差距从哪来
按硅谷数据工程师年薪15万美元算,三个月搭建期的人力成本就是3.75万刀。这套开源方案的总成本:一台4核16G的云服务器月租80刀,工程师3天工时。
差距不在于工具本身,在于"认知负债"。传统数仓方案要求团队同时懂Kafka、Spark、Airflow、Hive、Presto,每个工具都有自己的配置语言和故障模式。FastAPI+PG+dbt的组合,一个全栈工程师能从头跟到尾,调试时不用跨五个系统查日志。
我见过最极端的案例:一个独立开发者用这套方案支撑了10万DAU(日活跃用户)的内容产品,数据延迟控制在5分钟内,月基础设施成本不到200刀。换成Snowflake+dbt Cloud+Fivetran的商业组合,账单至少是10倍。
但这条路径也有天花板。当单日数据量过亿,或者需要实时流处理(延迟秒级),PG的分析能力确实不够看。那时候该切ClickHouse或Flink就得切,不要硬撑。
这套方案的真正价值,是让中小团队在"数据驱动"和"资源有限"之间找到平衡点。不是每个公司都需要Twitter级别的数据架构,先把基础指标算准、口径统一、文档齐全,比盲目上大数据平台实在得多。
那位朋友后来告诉我,他用省下的三个月时间,把用户分群模型做了七版迭代。第三版的时候发现之前埋点漏了关键事件,如果按原计划这时候还在调Airflow,这个bug可能要半年后才会暴露——那时候产品方向可能已经偏了。
你现在用的数据栈,有多少时间花在"让数据可用"上,又有多少时间花在"用数据做决策"上?
热门跟贴