Quack:DuckDB 的客户端-服务端协议

查看原文 HN 讨论

文章摘要

DuckDB 一直以”嵌入进程内(in-process)”为卖点——数据库就在你的 Python / Node / 浏览器 Wasm 进程里跑,没有网络开销。但这套模型有个硬伤:多个进程不能并发写同一份数据库文件。当你要把可观测性数据集中写入一个文件、同时还想让多个仪表盘并发查询时,就卡死了。Quack 就是 DuckDB 团队对这个问题的官方回答——“DuckDB 实例之间可以用 Quack 远程协议互相对话了”

设计上有几个有意思的选择。协议直接架在 HTTP 上——不是 TCP 自定义二进制,而是普通 HTTP,意味着可以白嫖现成的反向代理、防火墙、负载均衡器、认证系统。最关键的是,浏览器里的 DuckDB-Wasm 可以直接连到远程 DuckDB 服务端,省去了一整层 gateway。序列化格式没用 Arrow Flight SQL(虽然这是大数据圈的默认选项),而是用了一套基于 DuckDB 内部 primitives 的私有格式 application/duckdb——理由是不想被外部标准绑死、自己的格式可以快速迭代。

性能上 Quack 的优势体现在两处。第一是单次小查询:Arrow Flight 强制两次往返(先拿 schema 再拿数据),Quack 只要一次请求-响应,延迟减半。第二是批量传输:把 6000 万行结果搬走,Quack 用了 4.94 秒,Arrow Flight 用了 17.4 秒,PostgreSQL 用了 158 秒。小写入并发 8 线程时 Quack 跑到 5434 TPS,超过 PostgreSQL;继续往上加线程则被 DuckDB 自身的并发插入上限卡住。

安全默认值也走的是”先能用再开放”路线:随机生成的认证 token、默认只 bind 到 localhost、SSL 走外层反向代理。整套设计的哲学是把 DuckDB 从”嵌入式分析引擎”扩展到”轻量级数据基础设施”——既保留原来的本地速度,又能接入观测、共享、并发等场景,不需要切到 ClickHouse 或 Postgres。

HN 评论精华