我从filebeat-harvester中学到什么

Filebeat 是 Elastic Stack 里的日志采集器,Harvester 模块负责逐行读文件。我读它的源码本来是想看采集逻辑,结果最大的收获是它怎么管理一组相互依赖的协程的生命周期。这篇就围绕四个问题来拆: 如何为主协程添加超时控制? 主协程结束时如何优雅关闭其他协程? 如何控制多个协程的关闭顺序? 如何从外部安全地关闭任务并等待清理完成? ...

November 28, 2022 · 3 min · 502 words · fancive

Filebeat 中使用的设计模式

Filebeat 是 Elastic Stack 里那个轻量级的日志采集器。最近读它的源码,发现几处设计模式用得很顺手,记一下:Registry + LazyInit、Observer、Strategy 和 Object Pool 这四个,正好对应插件化、解耦、可配置和性能优化几个常见诉求。 ...

September 16, 2020 · 2 min · 329 words · fancive

深入理解 Go String 转 []byte 的容量分配机制

引言 在 Go 语言中,string 和 []byte 之间的转换是非常常见的操作。但你是否注意到,当将一个 3 字节的字符串转为 []byte 时,得到的切片容量却是 32?这背后隐藏着 Go 运行时的内存分配策略。本文将通过汇编代码分析,深入探究这个有趣的现象,帮助你理解 Go 在底层是如何处理类型转换和内存分配的。 核心问题: 为什么 []byte("abc") 的容量是 32 而不是 3? string 转 []byte 的底层实现是什么? Go 运行时如何进行内存分配? ...

May 31, 2020 · 5 min · 863 words · fancive

[翻译] Go Interface 深度解析

本文翻译自 Ian Lance Taylor 的博客文章 Go interfaces,讲的是 interface 在底层到底长什么样——静态类型、动态类型,以及那个最容易把人绕晕的值拷贝行为。后半段补了一点 Russ Cox 对 itable 内部结构的说明。 ...

May 6, 2020 · 2 min · 305 words · fancive