<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>生产部署 on DuckDB 实验室</title><link>https://duckdblab.org/zh/tags/%E7%94%9F%E4%BA%A7%E9%83%A8%E7%BD%B2/</link><description>Recent content in 生产部署 on DuckDB 实验室</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Fri, 15 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://duckdblab.org/zh/tags/%E7%94%9F%E4%BA%A7%E9%83%A8%E7%BD%B2/index.xml" rel="self" type="application/rss+xml"/><item><title>DuckDB Quack 协议：原生客户端-服务端架构全面解析</title><link>https://duckdblab.org/zh/post/duckdb-quack-protocol/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://duckdblab.org/zh/post/duckdb-quack-protocol/</guid><description>&lt;h2 id="引言"&gt;引言
&lt;/h2&gt;&lt;p&gt;DuckDB 自诞生以来一直以&amp;quot;嵌入式分析数据库&amp;quot;著称——它像 SQLite 一样嵌入到宿主进程中，无需单独部署服务端。这个设计带来的优势显而易见：零运维、零配置、毫秒级启动。但它也带来一个无法回避的硬伤：&lt;strong&gt;无法多进程并发访问同一个数据库文件&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果你的场景是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;10 个采集器同时向同一个数据库写入埋点日志&lt;/li&gt;
&lt;li&gt;一个 Dashboard 在实时查询，同时后台在跑批量 ETL&lt;/li&gt;
&lt;li&gt;多个微服务需要共享同一个分析数据源&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那么抱歉，DuckDB 原生不支持。多个进程同时写同一个 .db 文件，轻则数据损坏，重则进程崩溃。&lt;/p&gt;
&lt;p&gt;以前你怎么解决这个问题？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;用 pg_duckdb&lt;/strong&gt; —— 给 PostgreSQL 套一层 DuckDB 的执行引擎，曲线救国&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用 MotherDuck&lt;/strong&gt; —— 数据上云，花钱买 SaaS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;换 PostgreSQL/ClickHouse&lt;/strong&gt; —— 为了一个并发功能换掉整个技术栈&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自己写代理层&lt;/strong&gt; —— 用 Redis 或消息队列做写缓冲，自行处理冲突&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这些方案要么贵、要么复杂、要么引入了额外的运维负担。&lt;/p&gt;
&lt;p&gt;2026 年 5 月，DuckDB 团队交出了一份全新的答卷——&lt;strong&gt;Quack 协议&lt;/strong&gt;。一个构建在 HTTP 之上的原生远程通信协议，让 DuckDB 实例之间可以像 PostgreSQL 的客户端-服务端那样通信。这不是一个第三方插件，而是 DuckDB 核心团队开发的官方扩展。&lt;/p&gt;
&lt;h2 id="quack-协议的核心架构"&gt;Quack 协议的核心架构
&lt;/h2&gt;&lt;h3 id="设计理念"&gt;设计理念
&lt;/h3&gt;&lt;p&gt;Quack 的设计哲学可以概括为三个关键词：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;原生集成&lt;/strong&gt; — 不是外部代理，而是 DuckDB 扩展，&lt;code&gt;INSTALL quack&lt;/code&gt; 一行命令即可启用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单次往返&lt;/strong&gt; — 一次查询只需 1 次 network round trip，远比 Arrow Flight SQL（至少 2 次）高效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP 之上&lt;/strong&gt; — 基于 HTTP 协议构建，兼容现有网络基础设施，无需特殊端口或协议支持&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="架构图"&gt;架构图
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ DuckDB │ │ DuckDB │ │ DuckDB │
│ 客户端 A │ │ 客户端 B │ │ 客户端 C │
│ (采集器1) │ │ (采集器2) │ │ (Dashboard) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
 │ │ │
 └───────────────────┼───────────────────┘
 │ HTTP
 ▼
 ┌─────────────┐
 │ DuckDB │
 │ 服务端 │
 │ (数据存储) │
 └─────────────┘
 │
 ▼
 ┌─────────────┐
 │ .db 文件 │
 │ (单写者锁) │
 └─────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意：Quack 服务端本身是单进程访问 .db 文件的，但它可以接收来自多个客户端的请求，在服务端内部进行串行化处理。这样就实现了&amp;quot;外部并发、内部串行&amp;quot;的架构，既保证了数据一致性，又提供了并发访问的能力。&lt;/p&gt;
&lt;h2 id="快速上手"&gt;快速上手
&lt;/h2&gt;&lt;h3 id="服务端启动"&gt;服务端启动
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 在服务器上启动 DuckDB，执行以下命令
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;INSTALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;core_nightly&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;LOAD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 启动 Quack 服务监听 localhost:8338
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- token 用于客户端认证
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack_serve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;quack:localhost&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;super_secret&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 创建一些测试数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;read_csv_auto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;events.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="客户端连接"&gt;客户端连接
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 在客户端机器上执行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;INSTALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;core_nightly&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;LOAD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 创建认证密钥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SECRET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TOKEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;super_secret&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 挂载远程数据库
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ATTACH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;quack:localhost&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote_db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 查询远程表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 写数据到远程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;read_csv_auto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;new_events.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="一次往返的秘密"&gt;一次往返的秘密
&lt;/h3&gt;&lt;p&gt;Quack 将查询的元数据（schema、统计信息）打包到查询结果中一起返回。传统协议（如 Arrow Flight SQL）需要先请求元数据、再请求数据，至少 2 次往返。Quack 在 TCP 层面做了精细调优，将查询计划序列化后嵌入 HTTP 请求体，服务端执行后直接返回完整结果。&lt;/p&gt;
&lt;p&gt;这意味着在延迟较高的网络环境（如跨区域部署）中，Quack 的优势会被放大。&lt;/p&gt;
&lt;h2 id="性能基准测试"&gt;性能基准测试
&lt;/h2&gt;&lt;p&gt;DuckDB 团队在 AWS Arm 架构上进行了严格的基准测试，以下是核心数据：&lt;/p&gt;
&lt;h3 id="批量传输性能"&gt;批量传输性能
&lt;/h3&gt;&lt;p&gt;测试条件：60,000,000 行数据，约 76GB CSV 文件&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;协议&lt;/th&gt;
 &lt;th style="text-align: center"&gt;耗时&lt;/th&gt;
 &lt;th style="text-align: center"&gt;相对性能&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Quack&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;&amp;lt; 5 秒&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;基线&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Arrow Flight SQL&lt;/td&gt;
 &lt;td style="text-align: center"&gt;略慢于 Quack&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~90-95%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PostgreSQL (COPY)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;慢数个数量级&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&amp;lt;1%&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="小事务并发性能"&gt;小事务并发性能
&lt;/h3&gt;&lt;p&gt;测试条件：单行 INSERT，持续 5 秒&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;协议&lt;/th&gt;
 &lt;th style="text-align: center"&gt;峰值 TPS&lt;/th&gt;
 &lt;th style="text-align: center"&gt;备注&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Quack&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;~5,500&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;8 线程并发&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Arrow Flight SQL&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~2,500&lt;/td&gt;
 &lt;td style="text-align: center"&gt;约为 Quack 的一半&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PostgreSQL&lt;/td&gt;
 &lt;td style="text-align: center"&gt;更高 (10,000+)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;但架构完全不同&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="理解这些数字"&gt;理解这些数字
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;5,500 TPS&lt;/strong&gt; 意味着每秒钟可以处理 5,500 个独立的 INSERT 事务。对于日志采集场景，如果你每秒产生 5,000 条日志，一个 Quack 服务端足够应对。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;lt; 5 秒传输 60M 行&lt;/strong&gt; 意味着你可以用 Quack 做大规模数据同步，而非仅限于 OLTP 式的小事务。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="quack-vs-传统方案对比"&gt;Quack vs. 传统方案对比
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Quack&lt;/th&gt;
 &lt;th style="text-align: center"&gt;PostgreSQL&lt;/th&gt;
 &lt;th style="text-align: center"&gt;MotherDuck&lt;/th&gt;
 &lt;th style="text-align: center"&gt;自建代理层&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;部署复杂度&lt;/td&gt;
 &lt;td style="text-align: center"&gt;🔥 极低（一行命令）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⚠️ 中等（配置主从）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌ 高（数据上云）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌ 高（开发+运维）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;运维成本&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅ 几乎为零&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⚠️ 需要 DBA&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌ 按量付费&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌ 自行维护&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;查询延迟&lt;/td&gt;
 &lt;td style="text-align: center"&gt;🔥 1 次往返&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅ 2-3 次往返&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⚠️ 网络延迟高&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⚠️ 取决于代理实现&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;小事务 TPS&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~5,500&lt;/td&gt;
 &lt;td style="text-align: center"&gt;10,000+&lt;/td&gt;
 &lt;td style="text-align: center"&gt;受限于网络&lt;/td&gt;
 &lt;td style="text-align: center"&gt;取决于缓冲策略&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;批量传输 (60M行)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&amp;lt; 5 秒&lt;/td&gt;
 &lt;td style="text-align: center"&gt;极慢&lt;/td&gt;
 &lt;td style="text-align: center"&gt;受限于带宽&lt;/td&gt;
 &lt;td style="text-align: center"&gt;受限于带宽&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;数据本地性&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅ 数据在本地&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅ 数据在本地&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌ 数据在云端&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅ 数据在本地&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;费用&lt;/td&gt;
 &lt;td style="text-align: center"&gt;💰 &lt;strong&gt;完全免费&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;💰 免费（自建）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;💸 $20+/月起步&lt;/td&gt;
 &lt;td style="text-align: center"&gt;💰 开发成本&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;与 DuckDB API 兼容性&lt;/td&gt;
 &lt;td style="text-align: center"&gt;🔥 &lt;strong&gt;100% 兼容&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;⚠️ 需适配 pg&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅ 兼容&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅ 兼容&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="实际落地场景"&gt;实际落地场景
&lt;/h2&gt;&lt;h3 id="场景-1多采集器日志汇聚"&gt;场景 1：多采集器日志汇聚
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;需求：&lt;/strong&gt; 10 台服务器上的采集程序需要将访问日志写入同一个数据库，同时数据分析师需要实时查询。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;架构：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 服务端（一台 4C8G 服务器）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;duckdb -c &lt;span class="s2"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;INSTALL quack FROM core_nightly;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;LOAD quack;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;CALL quack_serve(&amp;#39;quack:0.0.0.0&amp;#39;, token = &amp;#39;my-token&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 每台采集器上&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; true&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; duckdb -c &lt;span class="s2"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; INSTALL quack FROM core_nightly;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; LOAD quack;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; CREATE SECRET (TYPE quack, TOKEN &amp;#39;my-token&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; ATTACH &amp;#39;quack:server-ip:8338&amp;#39; AS remote;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; INSERT INTO remote.access_logs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; SELECT * FROM read_csv_auto(&amp;#39;/var/log/access/&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%H&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;.csv&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="m"&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="场景-2轻量级-olap-服务"&gt;场景 2：轻量级 OLAP 服务
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;需求：&lt;/strong&gt; 给 20 个内部用户提供一个 SQL 查询接口，每个人都能查全量数据，但不能互相干扰。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 服务端预加载数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ATTACH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;./warehouse.db&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;warehouse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 客户端只需挂载
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;duckdb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;INSTALL quack FROM core_nightly;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;LOAD quack;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;CREATE SECRET (TYPE quack, TOKEN &amp;#39;analytics-token&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;ATTACH &amp;#39;quack:analytics.internal:8338&amp;#39; AS warehouse;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;-- 现在可以像本地表一样查询
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;SELECT department, sum(revenue)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;FROM warehouse.sales
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;WHERE sale_date &amp;gt;= &amp;#39;2026-01-01&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;GROUP BY department
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;ORDER BY sum(revenue) DESC;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="场景-3替代-elk-的轻量日志方案"&gt;场景 3：替代 ELK 的轻量日志方案
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;架构对比：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;方案&lt;/th&gt;
 &lt;th&gt;组件&lt;/th&gt;
 &lt;th style="text-align: center"&gt;资源消耗&lt;/th&gt;
 &lt;th style="text-align: center"&gt;运维复杂度&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;ELK Stack&lt;/td&gt;
 &lt;td&gt;Elasticsearch + Logstash + Kibana + Filebeat&lt;/td&gt;
 &lt;td style="text-align: center"&gt;16GB+ RAM&lt;/td&gt;
 &lt;td style="text-align: center"&gt;高&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB + Quack&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;DuckDB + 采集脚本&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;&amp;lt; 2GB RAM&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;极低&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对中小企业来说，ELK 太重了。用 Quack + DuckDB，一台 4C8G 的服务器可以轻松处理每天数亿条日志的写入和查询。&lt;/p&gt;
&lt;h2 id="局限性"&gt;局限性
&lt;/h2&gt;&lt;p&gt;任何技术都有短板，Quack 也不例外：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;单写者限制&lt;/strong&gt; — Quack 服务端内部仍然是单线程写入 .db 文件的，写入性能上限受限于 DuckDB 的写入能力。如果你的场景需要 50,000+ TPS，请考虑其他方案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全模型简单&lt;/strong&gt; — 目前仅支持 Token 认证，没有用户权限管理、SSL/TLS 需要自行在前面加反向代理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络敏感性&lt;/strong&gt; — 虽然 1 次往返很优秀，但如果客户端和服务端之间的延迟超过 100ms，查询体验仍会受影响。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仍在 nightly 阶段&lt;/strong&gt; — Quack 目前从 &lt;code&gt;core_nightly&lt;/code&gt; 仓库安装，尚未进入正式发布渠道。建议在测试环境充分验证后再上生产。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="变现建议"&gt;变现建议
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;轻量级日志分析 SaaS&lt;/strong&gt; — 用 Quack 做后端，提供给中小企业替代 ELK，$29/月起，一台服务器可以服务 50-100 个客户&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据分析咨询&lt;/strong&gt; — 帮客户从 PostgreSQL/MySQL 迁移到 DuckDB + Quack 架构，每个项目报价 ¥5,000-¥20,000&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多租户报表平台&lt;/strong&gt; — 每个租户一个 DuckDB 实例，通过 Quack 提供查询服务，月付 ¥299-¥999&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;培训与教程&lt;/strong&gt; — 围绕 Quack 的部署、调优、灾备方案制作付费教程，定价 ¥99-¥299&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;Quack 不只是一个新协议，它是 DuckDB 从&amp;quot;单机分析工具&amp;quot;走向&amp;quot;生产级数据处理引擎&amp;quot;的关键一步。它解决了 DuckDB 长期以来最大的痛点——多进程并发访问，同时保持了 DuckDB 一贯的&amp;quot;零配置、高性能&amp;quot;基因。&lt;/p&gt;
&lt;p&gt;对于正在使用或考虑使用 DuckDB 的团队，Quack 值得你现在就开始关注和测试。当它进入稳定版时，你的架构方案已经准备好了。&lt;/p&gt;
&lt;h3 id="参考链接"&gt;参考链接
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;DuckDB Quack 扩展文档: &lt;a class="link" href="https://duckdb.org/docs/current/extensions/quack" target="_blank" rel="noopener"
 &gt;https://duckdb.org/docs/current/extensions/quack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DuckDB 官方博客: &lt;a class="link" href="https://duckdb.org/news/" target="_blank" rel="noopener"
 &gt;https://duckdb.org/news/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub Discussion: &lt;a class="link" href="https://github.com/duckdb/duckdb/discussions" target="_blank" rel="noopener"
 &gt;https://github.com/duckdb/duckdb/discussions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>