Agora
评论留言社区 PythonFastAPIPostgreSQLWebSocketRedis自托管
压测 3.2k QPS · P99 延迟 47ms · 常驻内存 86MB
背景与动机
市面上现成的评论系统要么笨重(一套框架拖家带口),要么功能阉割。我要的是:实时、轻量、数据完全自控,并且在一台 1C1G 的小机器上跑得心安理得。
于是有 Agora——FastAPI 做 API 层,PostgreSQL 做持久层,WebSocket 做实时推送,Redis 做限流与会话。整套系统 docker-compose 一条命令拉起,也支持裸机 systemd 直跑。
架构与取舍
读写分离想都没想就拒绝了——评论场景读多写少,一个 PostgreSQL 主库加连接池足够,多一层数据库复制徒增运维负担。真正值得投入的优化在 WebSocket 广播:按房间分组的发布订阅,一人发言同房间毫秒级可见。
限流放在 Redis 里做滑动窗口,而不是进程内存计数——重启不丢状态,多进程部署也不会各算各的。JWT 鉴权无状态化,签名校验压在中间件一层完成。
难点与解决
最麻烦的是 1C1G 内存预算。PostgreSQL 默认配置先吃 400MB,把共享缓冲调到 128MB 后整机稳定在 460MB 左右;Uvicorn 固定双 worker,避免多进程复制 WebSocket 房间状态。
压测用 wrk 四线程 256 连接打满:3,201 QPS,P99 47ms,零错误。瓶颈在单核 CPU 的软中断,不在应用层——这个结论本身就是监控数据给的。
数据与结果
上线以来零宕机,由 Pulse(另一个自托管监控台)持续作证。本站的留言板就是 Agora 的架构移植版——运行时从 FastAPI 换成 Pages Functions,思路原封不动。