HTrace 与 Zipkin 简单教程

这篇文章介绍了 HTrace 在分布式系统中的基本作用,以及如何配合 Zipkin 对 RPC 调用链进行可视化追踪。正文先说明 HTrace 试图解决的问题,再梳理 Span、TraceScope、Tracer、Sampler 和 SpanReceiver 等核心概念,随后给出将数据输出到 Zipkin 的环境搭建方式,并分别用单机示例和模拟分布式 RPC 的多线程示例演示如何创建追踪链路、传递 SpanId 以及在 Zipkin 中查看各阶段的耗时。

JDK 动态代理踩坑

这篇文章围绕学习 JDK 动态代理时遇到的几个典型困惑展开,通过一组示例代码解释动态代理背后的运行机制。正文重点讨论了 Proxy.newProxyInstance() 中 ClassLoader 参数为什么看起来“随便填都能用”、为什么代理对象常常会触发 $Proxy0 cannot be cast to xxx 的类型转换错误,以及 InvocationHandler.invoke() 方法里 Object proxy 参数实际指向什么。文章通过逐个分析错误示例和代理类生成后的调用方式,把这些容易混淆的细节串起来,帮助理解 JDK 动态代理的正确用法。

解决 IDEA 阅读 Hadoop 源码报错问题

这篇文章记录了在 IDEA 中阅读 Hadoop 3.3.0 源码时,因缺失 protobuf 生成类而出现大量报错的排查过程和最终解决方案。正文先分析 proto 相关类缺失的原因,再依次尝试手动用 protoc 编译、在本地按官方文档直接用 Maven 构建、以及基于 IDEA 或 VS Code 的远程开发方案,并说明这些方法各自遇到的问题。最后文章给出一条可行路径:在远程 Linux、虚拟机或 Docker 环境中完成 Hadoop 编译,再将 target/generated-sources/java 中生成的源码拖回项目中供 IDEA 正常索引和阅读。

Log-Structured File System

这篇文章围绕 Log-Structured File System 的设计思想展开,说明它为何选择把大量小而随机的写操作先缓存在内存中,再聚合为顺序 log 写入磁盘,以尽量规避磁盘寻道开销。正文进一步介绍了 LFS 如何通过 inode map 和 checkpoint region 定位文件、如何用 segment 组织磁盘空间、如何借助 segment summary block 和 segment cleaning 回收无效数据,以及在 checkpoint 更新和 log 落盘过程中如何通过 roll forward 完成 crash recovery。

Fast File System

这篇文章系统梳理了 Fast File System 相比 Old Unix File System 的关键改进,重点解释它为何能在不改变 open()、read()、write() 等上层接口的前提下显著提升文件系统性能。正文先分析老 Unix 文件系统因 block 过小和数据碎片化导致的效率问题,再介绍 FFS 的 cylinder group 组织方式、更大的 block size、fragment 机制、按硬件参数优化布局和按 locality 进行文件摆放的策略,同时也补充了长文件名、符号链接、原子重命名和配额等功能增强,最后总结了 FFS 对后续现代文件系统设计的影响。

Amdahl’s law(阿姆达尔定律)公式推导与思考

这篇文章围绕 Amdahl's law 展开,说明并行计算中程序整体加速比为何会受到串行部分的限制。正文先解释公式里并行比例 a 和并行加速倍数 n 的含义,并引入 Fraction enhanced 与 Speedup enhanced 两个概念,再从总执行时间、并行代码时间和串行代码时间的关系出发,对公式 S = 1 / (1 - a + a / n) 进行推导。最后文章回到公式本身,讨论当并行比例固定、核心数持续增加时系统加速比仍存在理论上限这一结论。

分布式系统中的 Partial ordering 和 Global ordering 的理解

这篇文章用简化的事件顺序示例,解释了分布式系统中 partial ordering 与 global ordering 的区别。正文先说明全局有序要求所有事件都按统一顺序发生,而部分有序只约束存在依赖关系的那部分事件,再通过 A、B、C 三个事件的例子说明两者在系统行为上的差异,最后结合 Lamport Timestamp 指出这类逻辑时钟系统通常只能保证 partial ordering,而不是整个系统范围内的全局有序。

Proxmox Centos cloud-init 模板制作

这篇文章记录了在 Proxmox 环境中基于官方 CentOS cloud image 制作 cloud-init 模板的完整过程,目的是提高虚拟机的创建和销毁效率。正文先补充了可选的源替换、磁盘挂载和存储配置,随后说明如何下载 GenericCloud 镜像,并通过 qm create、qm importdisk、挂载 cloudinit、设置启动盘和串口控制台等命令完成模板制作,最后给出将模板转为可克隆虚拟机的使用方式。

Lamport 逻辑时钟(Lamport Timestamp)和 Vector Clock 简单理解

这篇文章从分布式系统里“真实时间不可靠、事件先后难以判断”的问题出发,系统讲解了 Lamport Timestamp 和 Vector Clock 两种逻辑时钟机制。正文先介绍 Lamport 逻辑时钟的基本规则、它与 happened-before 因果关系之间的联系,以及它无法判断并发事件关联性的局限;随后引出 Vector Clock,说明它如何通过向量比较识别独立事件,并进一步结合 Dynamo 的版本控制场景讨论其在多副本冲突检测中的应用,最后也分析了 Vector Clock 在伸缩性和唯一性上的缺陷。

有限状态机( Finite State Machine )JAVA 版

这篇文章用空调开关、吹风和制冷三种状态的切换过程,介绍了有限状态机在 Java 中的基本实现方式。正文先展示了使用枚举加 if/else 判断状态流转的传统写法,再给出基于枚举常量内聚状态迁移逻辑的有限状态机实现,并通过同一组测试对比两种方案的效果,说明状态机写法在处理复杂流程控制时更清晰,也更便于维护。