第二篇 采集与汇聚
管道的第一段是「把日志从文件里读出来、安全地汇到一起」。听起来简单,实际上藏着一排经典坑:日志文件会被按大小轮转,读着读着句柄就指向了旧文件;多路日志一起灌进一个通道,谁该先走谁该等着;通道满了是丢日志还是让上游等着——这些问题的答案共同决定了管道稳不稳。
本篇按「采集 → 通道 → 背压 → 攒批」的顺序展开,所有代码以 Rust 为例,但通道与背压的思路对任何语言都适用。云产品侧涉及云服务器 CVM 的磁盘 IO 配置与对象存储 COS 的归档写入,性价比方案可参考 腾讯云 AI 数据处理平台 ADP 特惠。
本篇路线
| 节 | 主题 | 解决什么 |
|---|---|---|
| 2.1 | 文件尾随与轮转 | 文件被切了怎么跟上 |
| 2.2 | mpsc 有界通道 | 多路日志怎么有序汇聚 |
| 2.3 | 背压控制 | 通道满了怎么办 |
| 2.4 | 批量聚合 | 攒批与定时刷的取舍 |
篇章关系
本篇是整条管道的「入口」,把吞吐上限的天花板先抬起来;第三篇的压缩与采样决定能省多少带宽;第四篇的落盘决定崩了能不能恢复。顺序读下来,等于把管道从头到尾走了一遍。相关的并发思路可对照 Go 微服务实战 里的通道章节。
延伸阅读
- 轮转的完整处理,见下一节 2.1。
- 背压与限速,见 2.3。
- 并发通道对照,见 Go 微服务实战。
- 采集与服务化的关系,见 Node.js 云开发实战。
