~/blog (main)*
◉ RSS 00:00:00
guest@chenmo: ~ — zsh — 80×24
guest@chenmo ~ %
//01WRITINGS

最新文章

全部归档 ↗
ls posts/ → 7 / 42 篇

用 Raft 手搓 KV 存储(二):线性一致读与 Lease Read 的取舍

从一条丢包的 AppendEntries 讲起。本文实现并压测了支持 ReadIndex 与 Lease Read 的教学级 KV 存储,分析两种读策略在网络分区下的行为差异。

Rust 异步的隐形成本:一次 Pin 与 Waker 的内存考古

为什么你的 Future 在堆上反复横跳?用 perf 和火焰图追查 tokio 任务调度的真实开销,以及何时应该回到同步代码。

把 P99 从 800ms 打到 80ms:一次全链路火焰图排查实录

不是 GC,不是数据库,最后凶手是连接池里的 DNS 缓存。完整复盘从假设、埋点、压测到修复的全过程,附排查清单。

Neovim 配置三年记:从 IDE 难民到终端原住民

lua 配置从 40 行膨胀到 1200 行又删回 300 行的全过程。哪些插件值得留下,哪些只是配置强迫症。

为什么我劝你读 RFC——以 TCP Fast Open 为例

博客会骗人,RFC 不会(大概)。从 RFC 7413 里挖出三个主流教程都讲错的细节,聊聊一手资料的阅读方法。

一致性哈希不够用的时候:有界负载与虚拟节点的取舍

当某个节点被热点 key 打爆时,一致性哈希救不了你。对比 Ring Hash、Maglev 与 Rendezvous 三种方案的生产实测数据。

写给 Go 程序员的 Rust 所有权备忘录

把 borrow checker 的 90% 报错映射到你已经懂的 GC 直觉上:什么时候 clone,什么时候 Arc,什么时候承认自己需要重构。

//02OPEN_SOURCE

开源项目

github.com/chen-mo ↗
//03SNIPPETS

碎片与灵感

更多片段 ↗
retry.go|Go · 18 行
// 指数退避 + 全抖动:比「重试 3 次」温柔得多
func Retry(ctx context.Context, fn func() error) error {
delay := 100 * time.Millisecond
for i := 0; i < 6; i++ {
if err := fn(); err == nil {
return nil
}
jitter := time.Duration(rand.Int63n(int64(delay)))
select {
case <-time.After(jitter):
case <-ctx.Done():
return ctx.Err()
}
delay *= 2
}
return errors.New("重试次数耗尽")
}
NOTE · 2025-06-21 23:14

Go 1.23 的 range over func 真香,配合 iter 包写管道终于不用回调套回调了。周末整理一篇笔记。

NOTE · 2025-06-09 21:02

把家里的 N100 小主机刷了 Proxmox,现在跑着 7 个容器 + 1 个 HomeLab 面板,整机功耗 6W,比路由器还安静。

NOTE · 2025-05-30 10:47

面试被问「如何设计全局唯一 ID」,聊到 Snowflake 的时钟回拨时发现自己的答案有漏洞,回来重读了一遍 Twitter 原文,已补充到旧文里。

//04CONNECT

订阅与友链

subscribe.shbash
$ ./subscribe.sh --channel email
每周三 21:00 推送新文章,只有正文,没有广告,随时退订。
// 等待输入…