分类 技术志 下的文章

别再滥用 ClickHouse 了!单机每秒狂刷 1800 万条数据,拆解 Go+DuckDB 的“微型数仓”降维打击

本文永久链接 – https://tonybai.com/2026/03/13/go-duckdb-micro-data-warehouse-dimensionality-reduction

大家好,我是Tony Bai。

设想这样一个极其普遍的日常工作场景:

产品经理找到你,希望能给业务后台加一个“简单”的数据看板,用来实时统计用户的 PV/UV 漏斗、Nginx 日志的慢查询分析,或者是 IoT 设备的近期时序数据。

面对每天几百万到上千万条的数据量,你陷入了沉思。

如果直接用 MySQL/PostgreSQL 跑 GROUP BY 和 COUNT(DISTINCT),数据库的 CPU 瞬间飙到 100%,不仅查询要等上十几秒,甚至可能把核心交易业务一起拖死。

如果为了这个需求,去大动干戈地部署一套 ClickHouse、Elasticsearch 、Spark 集群或某个大型时序数据库……不仅运维成本上天,对于这点数据量来说,简直是用高射炮打蚊子。

在“传统关系型数据库跑不动”和“大数据集群太沉重”之间,难道就没有一个恰到好处的方案吗?

今天,我想给你介绍一个在海外工程界使用较多的方案。它不仅能把你从沉重的大数据组件中解救出来,还能在你的 Go 语言单二进制文件中,塞进一个性能恐怖的 OLAP(在线分析处理)引擎。

它就是 DuckDB。结合 Go 语言,它能在普通服务器上跑出每秒 1800 万条记录的写入速度,和毫秒级的亿级数据分析延迟。

这绝对是一场对传统数据架构的降维打击。

为什么 MySQL/PG 做不好数据分析?

很多开发者在职业生涯早期都会踩这个坑:试图用 MySQL 解决一切问题。

当你在 PostgreSQL 或 MySQL 中执行一个跨度为 30 天的聚合分析时,为什么会慢得让人绝望?因为它们的底层是“行式存储(Row-oriented)”

在行式存储中,即使你只需要 user_id 和 timestamp 这两列,数据库也必须把每一行的所有字段(包括那些庞大的 JSON 或 Text 字段)全部从磁盘加载到内存中。大量无用的 I/O 消耗,让分析查询变成了灾难。

为了解决这个问题,我们被迫引入了 ClickHouse 等“列式存储(Column-oriented)”数据库。列式存储让分析查询的速度提升了上百倍,但代价是:你需要额外部署和维护分布式集群、学习复杂的表引擎配置等。

DuckDB——OLAP 界的 SQLite

难道列式存储就必须伴随着复杂的集群部署吗?

DuckDB 给出了一个极其优雅的答案:做 OLAP 领域的 SQLite。

DuckDB 是一个纯粹的嵌入式列式数据库。它没有独立的服务器进程,而是内嵌在你的应用进程中,不需要你配置任何网络端口。它有很多语言的binding,包括Go。

在 Go 项目中,你只需要简单地 import “github.com/duckdb/duckdb-go/v2″,它就会作为动态/静态链接库,直接融入你的 Go Application 进程中。

但千万别因为“嵌入式”三个字就觉得它是玩具。社区的一款开源高性能数据库 Arc(基于 Go + DuckDB)给出了一份令人毛骨悚然的实测数据(基于MacBook Pro M3 Max (14 cores, 36GB RAM, 1TB NVMe)):

  • 写入性能:高达 18.6M+(1860万)记录/秒
  • 写入延迟:P50 < 0.5ms,P99 < 4ms
  • 查询性能:6M+(600万)行/秒扫描 (Arrow格式)

它是怎么做到的?除了列式存储,它底层还偷偷藏着两个大杀器:向量化执行引擎(Vectorized Execution) 和对 Parquet 格式的原生支持

手把手拆解 1800 万/秒的极致写入

口说无凭,我们直接上硬核源码。

很多新手刚接入 DuckDB 时,会习惯性地用标准 SQL 的 INSERT INTO … VALUES 去循环写数据。你会发现速度并不快,一秒钟只能写几万条。

真正的降维打击,藏在 DuckDB 专门为 Go 语言暴露的 Appender API 中。

Appender 绕过了繁琐的 SQL 解析器和规划器,直接将 Go 的内存数据格式,以极低的开销批量“灌”入 DuckDB 的底层列存结构中。来看这段极致狂暴的写入代码:

// https://go.dev/play/p/mHXu-kAydDX
package main

import (
    "context"
    "database/sql"
    "fmt"
    "log"
    "time"

    duckdb "github.com/duckdb/duckdb-go/v2"
)

func main() {
    // 1. 用 NewConnector 创建连接器(指定数据库文件)
    connector, err := duckdb.NewConnector("analytics.db", nil)
    if err != nil {
        log.Fatal(err)
    }
    defer connector.Close()

    // 2. 用 sql.OpenDB 打开标准 db(用于建表等 SQL 操作)
    db := sql.OpenDB(connector)
    defer db.Close()

    _, err = db.Exec(CREATE TABLE IF NOT EXISTS metrics (id INTEGER, name VARCHAR, value DOUBLE, ts TIMESTAMP))
    if err != nil {
        log.Fatal(err)
    }

    // 3. 用 connector.Connect() 获取底层 driver.Conn(Appender 需要这个)
    conn, err := connector.Connect(context.Background())
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // 4. 直接传 driver.Conn,无需 Raw()
    appender, err := duckdb.NewAppenderFromConn(conn, "", "metrics")
    if err != nil {
        log.Fatal(err)
    }
    defer appender.Close()

    startTime := time.Now()

    for i := 0; i < 100000; i++ {
        err := appender.AppendRow(
            int32(i),
            fmt.Sprintf("metric_%d", i%10),
            float64(i%100),
            time.Now(),
        )
        if err != nil {
            log.Fatal(err)
        }
    }

    elapsed := time.Since(startTime)
    fmt.Printf("插入 10 万条数据耗时: %v\n", elapsed)
    fmt.Printf("吞吐量: %.0f 记录/秒\n", 100000.0/elapsed.Seconds())
}

在我的一台2019款 普通 MBP 笔记本(Intel芯片)上,上述这段代码写入 10 万条数据仅需 69 毫秒

插入 10 万条数据耗时: 69.466586ms
吞吐量: 1439541 记录/秒

换算下来,吞吐量轻松突破 143 万条/秒。如果开启并发和更大批次,逼近千万级似乎也毫无压力。这比传统的 SQL INSERT 快了整整 100 倍

替代 ELK,只需一个 Go 二进制文件

掌握了这把利器,我们该如何在实际业务中发挥它的威力?

假设你有一个 10GB 的 Nginx 日志文件(或者 CSV 文件),老板让你马上查一下昨天的 PV、UV 和慢查询排行。

过去,你需要搭建 Logstash -> Elasticsearch -> Kibana 这一套全家桶。

现在,你只需要写几十行 Go 代码。DuckDB 支持直接查询 CSV 和 Parquet 文件,连数据导入都省了

你可以直接把底层的统计逻辑嵌在你的 Go REST API 里(仅作说明使用):

// 直接在 Go 代码中,把 DuckDB 当作微型分析网关
func (adb *AnalyticsDB) GetHourlyStats() (map[string]interface{}, error) {
    // 惊人特性:直接用 SQL 语法查询本地或 S3 上的 Parquet 压缩文件!
    rows, err := adb.db.Query(
        SELECT
            DATE_TRUNC('hour', timestamp) as hour,
            COUNT(*) as pv,
            COUNT(DISTINCT path) as uv
        FROM read_parquet('s3://my-bucket/nginx_logs/*.parquet')  -- 对 Parquet 格式的原生支持与深度优化(谓词下推、列裁剪),可跳过无关数据块,大幅减少实际 I/O
        WHERE timestamp > NOW() - INTERVAL '24 hours'
        GROUP BY hour
        ORDER BY hour DESC
    )
    // ... 解析并返回给前端
}

通过这种架构,你的 Go 语言 Web 服务瞬间拥有了媲美 ClickHouse 的 OLAP 分析能力。

最绝的是,整个系统的部署产物,仅仅是一个几十 MB 的 Go 二进制文件。没有额外的依赖,丢上服务器就能跑。

小结:它不是万能的银弹

虽然 DuckDB 强到离谱,但作为高级工程师,我们必须理智看待边界。

DuckDB 绝对不适合做高并发的 OLTP(在线事务处理)。

如果你用它来扛电商的下单扣库存、或者多用户的并发更新行数据,它会死得很惨。因为它是一头为了“大吞吐分析”而生的巨兽,并没有针对行级锁和高频短事务做优化。

所以,最完美的现代架构公式应该是:

PostgreSQL/MySQL(负责核心业务流) + Go 应用内嵌 DuckDB(负责旁路日志、报表聚合的简单轻量分析)。


** 今日互动探讨:**

你在公司里遇到过哪些“为了小数据杀鸡用牛刀,强行部署大集群”的奇葩架构?或者你平时处理百万级数据分析时,最爱用什么工具?

欢迎在评论区疯狂吐槽或分享!


认知跃迁:掌控架构降维打击的底层逻辑

看到这里,你是否对日常的业务开发有了全新的视角?

在过去,面对复杂的分析需求,CRUD 程序员的本能反应是“引入一个新的重量级中间件”。

但真正的高级架构师,懂得利用底层技术栈的差异性(如行存与列存、向量化与标量计算),用最轻量、最克制的方案完成“降维打击”。

如果你的 Go 技能依然停留在写写简单的增删改查 API,对更深层的并发控制、内存管理和系统级架构选型感到迷茫——

我的极客时间专栏《Go语言进阶课》正是为你量身打造!

在这 30+ 讲硬核内容中,我将带你剥开语法糖,深入理解 Go 的底层运行机制,不仅教你写代码,更教你像顶级大厂架构师一样思考:如何用最少的组件,设计出极高并发、极低延迟的优雅系统。

目标只有一个:助你完成从“Go 熟练工”到“能做顶级架构决策的 Go 专家”的蜕变!

扫描下方二维码,加入专栏,让我们一起用技术实现“四两拨千斤”的震撼。


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

别再卷前端 UI 了!未来万亿级用户的产品,根本没有界面

本文永久链接 – https://tonybai.com/2026/03/12/building-for-trillions-of-agents

大家好,我是Tony Bai。

如果你看一眼2025年 Web 流量统计报告,你会发现一个令人脊背发凉的残酷真相:人类,在互联网上已经正式成为少数派,机器流量已历史性突破 50%。

硅谷创业教父 Paul Graham 曾有一句被无数创业者和产品经理奉为圭臬的名言:“Make something people want.”(做人们想要的东西)。

但在今天,如果你还在死磕这句话,你可能会死得很惨。在这个 AI Agent(智能体)全面爆发的前夜,这句箴言必须被冷酷地改写为:
“Make something Agents want.”(做智能体想要的东西)。

因为未来的超级软件,根本不需要界面。

你精心打磨的 UI,在 AI 眼里一文不值

过去这几年,我们的开发者和 SaaS 创业者都在疯狂地“卷”前端:我们花了无数个熬红双眼的夜晚,去优化页面的停留时长,去测试按钮的颜色,去设计无比华丽的交互动画和留客弹窗。

我们试图把最核心的功能藏在复杂的 Web 界面后,以此作为产品的“护城河”。

但现实狠狠地给了我们一记耳光。

因为在未来,那些高度硬核的知识工作者(首当其冲是程序员),将不再亲自去挑选工具、注册账号、点击鼠标。他们只会向自己的 Claude Code 或 OpenClaw 下达指令:“帮我把这个数据库清洗一遍。”

Agent 会成为那个真正“做决定”和“使用产品”的人。

YCombinator 的合伙人 Jared Friedman 曾一针见血地指出过现存系统最致命的 Bug:目前大多数标榜牛逼的开发者工具,依然不允许你通过纯 API 来注册账号和获取 Key。

如果你的系统不能让 Agent 瞬间自动注册并调用,那你的服务在硅基生命眼里就等于“死”了。Agent 根本没有耐心去看你的华丽网页,更不会去看你的网络研讨会(Webinar)。它只会默默绕过你,去寻找那些 API 最清晰、对机器最友好的竞品。

旧时代的 PLG(Product-Led Growth,产品驱动增长)漏斗彻底失效,我们正在进入一个由“API 文档决定生死”的时代。

旧商业模式崩塌,万亿 Agent 的新基建

当我深入研究目前最前沿的 Agent 生态时,我发现,不仅仅是前端 UI 失效了,连我们习以为常的“按人头收费(Seat-based)”的商业模式也在崩塌。

试想一下,如果一个企业从 50 个普通人类员工,变成了“50 个人类 + 5000 个全天候运行的 Agent”,按人头收费的逻辑怎么算?

Agent 的工作负载是爆发式的,它可能在一秒钟内发起 50 次并发请求,瞬间击穿你原本为“人类手速”设计的限流(Rate Limit)网关。

不要再去应用层卷那些同质化的 AI 壳子了。真正聪明的开发者,已经开始为万亿规模的 Agent 造轮子。以下是四大正在爆发的基础设施赛道:

  1. Agent 的沙盒计算层:未来的服务器农场不是为了托管人类的网站,而是为了托管 Agent 的无状态执行沙盒(如 E2B)。
  2. Agent 的身份与钱包:Agent 需要在互联网上爬取付费资源,Stripe 级别的微支付(Microtransactions)将迎来真正的机器间交易刚需。
  3. 机器间的服务发现(Service Discovery):当人类退居幕后,Agent 之间如何知道对方能提供什么服务?我们需要机器与机器之间的“握手协议”。
  4. 信任与越权治理:当 Agent 带着你的授权去操作公司核心 CRM 时,如何防止它“幻觉越权”?


图:E2B沙盒运行示意图

Agent-First 时代的生存铁律

Perplexity CEO Aravind Srinivas 说过一句极具穿透力的话:“把电脑给电脑,让它们为人类创造与人类使用电脑时相同的输出,是一个更好的主意。”

在这个不可逆转的软件重心转移中,普通开发者该如何避免被淘汰?请牢记以下三条铁律:

  • 铁律一:API 就是你的最终 UI。 如果你的核心功能没有暴露在 API、CLI(命令行)或 MCP (Model Context Protocol) 接口中,它就不存在。
  • 铁律二:文档是写给机器看的。 你的 –help 文档和 API Schema 必须极度结构化,让 Agent 的大语言模型能做到“一秒读懂、零次试错”。
  • 铁律三:放弃闭环壁垒,拥抱极致的可组合性(Composability)。 打造干净的、无状态的、可被机器随时读取和拼接的工作流。

丢掉鼠标,成为“造规则”的人

未来的十年,是复杂性从“人机交互”向“机器间协议”下沉的十年。

作为开发者,现在最紧迫的任务,就是明天上班打开你的项目,问自己一个问题:“如果不用网页,一个纯粹的 AI Agent 能在 5 秒内调通我的核心链路吗?”

去构建那些没有界面的、纯粹的、让 Agent 感到舒适的系统吧,它们才是下一个时代的王者。

参考资料:

  • https://x.com/levie/status/2030714592238956960
  • https://www.imperva.com/resources/resource-library/reports/2025-bad-bot-report

今日互动吐槽:

你觉得目前市面上,哪个常用产品/SaaS 的 API 设计得最反人类、最让 AI(和你自己)抓狂?

欢迎在评论区疯狂吐槽!


认知跃迁:如何抢跑 Agent 原生时代?

理念再宏大,如果不落实到代码上,宏大叙事就只是别人的狂欢。

很多老读者问我:“Tony 老师,道理我都懂,但我该如何从零开始,改造现有系统,设计一套自描述的 MCP 接口?又该如何让 Claude Code 帮我跑通复杂的自动化工作流?”

光靠看研报是学不会造轮子的。与其焦虑自己会被 AI 淘汰,不如抢先一步,成为驾驭 AI 的那个人。

在我的全新极客时间专栏 AI原生开发工作流实战 中,我将摒弃一切虚无缥缈的理论,直接从代码层面,手把手教你构建面向 Agent 的 API 和工具链。

  • 告别低效内耗,重塑开发范式:带你用 AI 抹平代码复杂度的壁垒,专注于业务与架构的本质。
  • 驾驭 AI Agent 工作流:手把手教你实现从需求分析、MCP 接口设计到代码生成的自动化流水线。
  • 实现职场跃升:从苦哈哈的“写死代码的搬砖人”,进化为用规则驱动万物互联的“工作流指挥家”

别再执着于网页上按钮的颜色了。扫描下方二维码,加入专栏,我们一起去构建万亿硅基生命的世界基石。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com
这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats