Smith

  • HTrace 与 Zipkin 简单教程

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

    2021年1月21日
    2.7K0
  • JDK 动态代理踩坑

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

    2021年1月1日
    1.6K0
  • 解决 IDEA 阅读 Hadoop 源码报错问题

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

    2020年12月28日
    2.6K1
  • 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。

    2020年12月2日
    2.2K0
  • Fast File System

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

    2020年11月29日
    2.8K0
  • Amdahl’s law(阿姆达尔定律)公式推导与思考

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

    2020年10月13日
    7.1K2
  • 分布式系统中的 Partial ordering 和 Global ordering 的理解

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

    2020年10月13日
    1.7K0
  • Proxmox Centos cloud-init 模板制作

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

    2020年10月13日
    2.7K0
  • Lamport 逻辑时钟(Lamport Timestamp)和 Vector Clock 简单理解

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

    2020年10月13日
    3.6K1
  • 有限状态机( Finite State Machine )JAVA 版

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

    2020年1月30日
    2.2K0