技术文章

从数据路径、系统边界和故障现场理解复杂软件

文章分为大数据系统、浏览器内核、系统工程与 AI 工程四个专题。每篇文章尽量回答三个问题:组件负责什么、请求怎样执行、出现问题时从哪里查起。

大数据系统 · 浏览器内核 · 系统工程 · AI 工程

浏览器内核不是一个“把 HTML 画出来”的库。页面从网络字节变成屏幕像素,要穿过进程隔离、文档解析、脚本执行、布局、绘制、光栅化和 GPU 合成;嵌入 Android 应用后,还要处理 Java/C++ 生命周期、IPC 和移动设备的内存上限。

下面不做概念速览,而是沿着真实调用链逐层拆开这些组件。

本文按真实调用链组织,右侧目录可以直接跳转到对应阶段。

第一部分:浏览器引擎基础原理

一、浏览器到底是什么?

1.1 从用户视角看

你在手机示例应用里输入 example.com,看到一个页面。这个过程中发生了什么?

sequenceDiagram
    p...

第一次接触 Kudu 和 Impala,最容易产生两个误解:把 Kudu 当成“另一个 HDFS”,或者把 Impala 当成“装在 Kudu 上面的数据库”。两种说法都没有抓住边界。

Kudu 是分布式存储引擎。 它负责把表切成 Tablet,保存每一行、处理主键、更新、删除、快照和多副本。

Impala 是分布式 SQL 查询引擎。 它负责理解 SQL、选择执行计划、安排并行任务、扫描数据、执行 Join、聚合和排序,再把结果返回客户端。

两者组合后,Impala 可以查询和修改 Kudu 表,但数据最终仍由 Kudu 保存;Kudu 不负责解析 GROUP BY 或规...

Agent 最容易被说复杂,也最容易被做得过于简单。接一个大模型,再挂几个函数,并不自动等于“智能体”。真正拉开差距的是模型之外的部分:状态有没有落盘、动作是否可验证、失败后能否从断点继续、权限边界是否真的生效。

与其争论定义,不如看一个任务能否稳定跑完。

从普通脚本的边界说起

固定流程适合条件清楚的任务:读取输入、转换格式、写出结果。它的优点恰恰是没有自主性,行为容易预测。

问题出现在输入和环境都不稳定时。例如“检查一台服务器并修复站点”至少包含信息收集、故障判断、方案选择、执行、验证和回滚准备。每一步的结果都会改变下一步,预先写死全部分支很快就会失控。

Agent...

Kudu 最值得研究的地方,不是“支持 UPDATE 的列式存储”这句话,而是它如何把两种冲突的访问模式放进同一个 Tablet:新数据要低延迟写入,分析查询又希望读取紧凑、按列编码的数据;更新不能重写整列文件,历史版本还必须对快照读可见。

解决办法不是某一种神奇数据结构,而是一组分层结构:MemRowSet 接住新行,DiskRowSet 提供列式基线,Delta Store 承载更新,WAL 与 Raft 负责持久性和复制,MVCC 决定每个快照能看到什么。

本文基于 Kudu 1.18.1 源码,文件路径均相对于 src/kudu/。

Tablet 才是存储与一致性

...

Impala 查询快,不是因为它省略了 SQL 优化,也不是简单地“绕过 MapReduce”。真正的区别在执行形态:Daemon 常驻、元数据常驻、查询被切成并行 Fragment,数据通过 Exchange 在节点间流动,Scan、Join 和 Aggregate 尽可能组成流水线,并由 Runtime Filter 在运行期缩小扫描范围。

本文以 Impala 4.5.0 为基线,从一条 SQL 进入 impalad 开始,追到 RowBatch 穿过执行树并回到客户端。源码路径均相对于 Impala 仓库。

先建立进程视图

Impala 集群的核心角色不是传统意义上...

静态站点部署不难,难的是把每一层的责任分清。DNS 只负责把名字指向地址,云防火墙决定流量能否到达主机,Nginx 决定请求落到哪里,Certbot 则依赖前面整条链路完成域名验证。任何一层配置错了,浏览器看到的都可能只是“无法访问”。

这里使用一台 Linux 云主机、Nginx、Hugo 和 Let’s Encrypt 搭出最小闭环。它没有数据库和常驻业务进程,适合博客、作品集和文档站,也足够清楚地暴露网络部署中的关键边界。

最终架构

浏览器
  ↓ HTTPS :443
example.com
  ↓ A 记录
Azure 公网 IPv4
  ↓
Azure NSG +...