<?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/%E5%AE%A2%E6%88%B7%E7%AB%AF-%E6%9C%8D%E5%8A%A1%E5%99%A8/</link><description>Recent content in 客户端-服务器 on DuckDB 实验室</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Wed, 13 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://duckdblab.org/zh/tags/%E5%AE%A2%E6%88%B7%E7%AB%AF-%E6%9C%8D%E5%8A%A1%E5%99%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>DuckDB Quack 协议发布：DuckDB 也能当服务器跑了</title><link>https://duckdblab.org/zh/post/duckdb-quack-remote-protocol/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://duckdblab.org/zh/post/duckdb-quack-remote-protocol/</guid><description>&lt;h2 id="等等duckdb-不是嵌入式数据库吗"&gt;等等，DuckDB 不是&amp;quot;嵌入式&amp;quot;数据库吗？
&lt;/h2&gt;&lt;p&gt;没错，DuckDB 从 2019 年诞生起，一直标榜自己是 &lt;strong&gt;in-process（进程内）架构&lt;/strong&gt;——没有客户端，没有服务器，没有通信协议，直接通过底层 API 调用。这在数据科学、Python notebook、嵌入式分析等场景下简直完美。&lt;/p&gt;
&lt;p&gt;但有一个痛点一直没解决：&lt;strong&gt;多个进程同时写同一个数据库文件怎么办？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你有一堆采集程序在往同一个 DuckDB 里写数据&lt;/li&gt;
&lt;li&gt;同时还有一个仪表盘在查这些表&lt;/li&gt;
&lt;li&gt;两个进程同时写 → 崩了 😅&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以前怎么办？要么自己搭个 RPC 服务，要么用 &lt;code&gt;Arrow Flight SQL&lt;/code&gt; 协议，要么投奔 MotherDuck，要么（叹气）切到 PostgreSQL。&lt;/p&gt;
&lt;p&gt;2026 年 5 月 12 日，DuckDB 官方终于出手了——&lt;strong&gt;Quack 协议正式发布&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="什么是-quack"&gt;什么是 Quack？
&lt;/h2&gt;&lt;p&gt;Quack 是 DuckDB 之间的通信协议。两只鸭子怎么说话？Quack（嘎嘎）！所以 DuckDB 实例之间通信的协议就叫 Quack，非常合理 😄&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;: 现在你可以把 DuckDB 当服务器跑，其他 DuckDB 实例当客户端连上来读写数据。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;Quack 有几个关键特性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基于 HTTP&lt;/strong&gt;——不走私有协议，防火墙友好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;支持多客户端并发写入&lt;/strong&gt;——终于解决了一直以来的痛点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;支持认证&lt;/strong&gt;——通过 token 保证安全&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据格式用 Arrow&lt;/strong&gt;——零拷贝、高性能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;支持查询和下推操作&lt;/strong&gt;——不只是简单的读写&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="快速上手"&gt;快速上手
&lt;/h2&gt;&lt;p&gt;需要两个 DuckDB 实例（v1.5.2 以上），装 Quack 扩展：&lt;/p&gt;
&lt;h3 id="服务端duckdb-1"&gt;服务端（DuckDB #1）
&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="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="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="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="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&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="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="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="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;hello&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="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="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;world&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;v&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&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;p&gt;就三行代码，DuckDB 变成了一个服务器，监听 &lt;code&gt;quack:localhost&lt;/code&gt; 地址，等待客户端连接。&lt;/p&gt;
&lt;h3 id="客户端duckdb-2"&gt;客户端（DuckDB #2）
&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="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="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="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&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;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&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;p&gt;输出：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;world
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;看到了吗？客户端直接查询了服务端上的表，就像查本地表一样自然。&lt;/p&gt;
&lt;h2 id="不只是查询写入ddl全部支持"&gt;不只是查询——写入、DDL、全部支持
&lt;/h2&gt;&lt;p&gt;Quack 不是只读的。客户端也可以写入：&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="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;remote&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello2&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="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="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;world2&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;v&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&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;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello2&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;p&gt;输出：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;world2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;也就是说，你可以把 Quack 当作一个全功能的数据库连接来用——CRUD、DDL、事务，全部支持。&lt;/p&gt;
&lt;h2 id="适合什么场景"&gt;适合什么场景？
&lt;/h2&gt;&lt;p&gt;Quack 解锁了一大波之前 DuckDB 搞不定的场景：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;场景&lt;/th&gt;
 &lt;th style="text-align: left"&gt;以前怎么办&lt;/th&gt;
 &lt;th style="text-align: left"&gt;现在&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;多进程写入同一个库&lt;/td&gt;
 &lt;td style="text-align: left"&gt;❌ 不行，会崩溃&lt;/td&gt;
 &lt;td style="text-align: left"&gt;✅ Quack 做服务端，多客户端并发写&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;仪表盘实时查询+后台写&lt;/td&gt;
 &lt;td style="text-align: left"&gt;❌ 只能单进程&lt;/td&gt;
 &lt;td style="text-align: left"&gt;✅ 一个 Quack 服务端，N 个客户端&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;微服务间共享数据&lt;/td&gt;
 &lt;td style="text-align: left"&gt;搭自定义 RPC&lt;/td&gt;
 &lt;td style="text-align: left"&gt;✅ 原生 ATTACH 语法&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;远程数据分析&lt;/td&gt;
 &lt;td style="text-align: left"&gt;SCP 传文件&lt;/td&gt;
 &lt;td style="text-align: left"&gt;✅ ATTACH 远程实例直接查&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;嵌入式设备采集数据统一入库&lt;/td&gt;
 &lt;td style="text-align: left"&gt;逐个文件合并&lt;/td&gt;
 &lt;td style="text-align: left"&gt;✅ 批量 INSERT 进同一个 Quack 服务&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="底层原理简介"&gt;底层原理简介
&lt;/h2&gt;&lt;p&gt;Quack 协议是这样工作的：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;客户端 服务端
 │ │
 │── HTTP POST ──────→ │ (查询请求, Arrow格式)
 │ │
 │←── Arrow Stream ──→ │ (流式返回数据)
 │ │
 │── HTTP POST ──────→ │ (写入请求)
 │←── Affected Rows ── │ (返回影响行数)
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;通信层&lt;/strong&gt;：HTTP + Arrow，不是套接字，不是二进制协议&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据格式&lt;/strong&gt;：Arrow，零拷贝传输，高性能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;认证&lt;/strong&gt;：配置一个 secret token，简单但够用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;寻址&lt;/strong&gt;：&lt;code&gt;quack:host:port&lt;/code&gt; 格式，支持 &lt;code&gt;localhost&lt;/code&gt; 和远程地址&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相比 PostgreSQL 的 wire protocol，Quack 轻量得多；相比 Arrow Flight SQL，Quack 更贴近 DuckDB 的使用习惯。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：Quack 目前还在 &lt;code&gt;core_nightly&lt;/code&gt; 仓库中，并非默认扩展。DuckDB 团队明确表示这是&amp;quot;初版&amp;quot;，后续会持续改进。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="动手试试"&gt;动手试试
&lt;/h2&gt;&lt;p&gt;装个 DuckDB v1.5.2，开两个终端窗口：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;终端 1（服务端）&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;# 启动后挂起，等待客户端连接&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:localhost&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;CREATE TABLE events AS SELECT 1 AS id, &amp;#39;test&amp;#39; AS name;
&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 &amp;#39;Server ready!&amp;#39; AS status;
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;终端 2（客户端）&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;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:localhost&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;FROM remote.events;
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果看到 &lt;code&gt;1│test&lt;/code&gt; 输出，恭喜你，两个 DuckDB 已经通过 Quack 协议成功通话了！&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;Quack 是 DuckDB 发展史上的一个重要里程碑。它不是在否定&amp;quot;进程内架构&amp;quot;的优势——对于单机数据分析，in-process 依然是 DuckDB 的核心竞争力。但当你需要多进程协作、远程访问、实时更新共享数据时，Quack 提供了一个优雅的原生方案。&lt;/p&gt;
&lt;p&gt;安装很简单，语法很 DuckDB，性能很 Arrow。一句话总结：&lt;strong&gt;该快的时候快，该连的时候连。&lt;/strong&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;原文：https://duckdb.org/2026/05/12/quack-remote-protocol&lt;/p&gt;

 &lt;/blockquote&gt;</description></item></channel></rss>