工程实践: 雪花算法、MOCK、打桩 | 青训营笔记

311 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

雪花算法

Snowflake(雪花算法) 是用于分布式系统生成全局唯一 ID 值的算法

ID 结构

What-is-Snowflake-01.png
首位 0

Snowflake 生成的 ID 值为64bit 整型数据,因此二进制位首位 0 表示当前数值为正数

时间戳

41 bit 的时间戳,二进制表示最大为 24112^{41} - 1 毫秒,换算成年份,最大可以表示 69 年

机器 ID

10 bit 的机器 ID 值,最大标识 1024 台机器

ID 序号

序号表示,当前一毫秒内生成的第几个 ID

12 bit 的序号值,最大标识 4096 个 ID,当一毫秒内生成的 ID 数量超过 4096 就会转到下一毫秒生成

为什么使用雪花算法

  • 生成的 ID 具有全局唯一性
  • ID 序号可以保证生成的 ID 是递增的
  • 不依赖数据库或者某一台机器,去中心化
  • 一毫秒内最多生成 1024×40961024 ×4096 个 ID,容量大

缺陷

由雪花算法生成的 ID 结构可知,毫秒级时间戳和 ID 序号值受时钟影响

  • 当多台机器的系统时钟不一致时,可能生成重复的 ID
  • 由于某些原因,导致机器的系统时钟发生回拨,在回拨时间与当前时间的差值内也可能生成重复的 ID

解决时间回拨问题

待补完...


打桩和 MOCK

简介

模拟(mock) 被测试对象的依赖,来测试被测试对象
mock 的是依赖

无依赖的单元测试

What-is-MOCK-01.png

在单元测试中,被测试对象内部已经包含了当前函数功能所需的所有参数,对外部无依赖。

无论外部因素如何变化,测试对象内部无论经过多少次运行,都会输出范围内的确定结果。

有依赖的单元测试

What-is-MOCK-02.png

当被测试对象依赖外部结果时,对于外部依赖运行的结果不同,测试对象运行的结果可能不同。

在测试中,为保证测试函数的稳定性幂等性,因此需要控制外部依赖的结果。

在开发过程中,可能由于外部依赖模块由其他人员编写,或者进度不统一等情况。在测试本模块时,需要开发人员手动模拟外部依赖的结果,这就是 mock 测试。

打桩(stub)

What-is-MOCK-03.png 由图中 part1part2 均是外部依赖传入的结果,分别依赖两个外部模块 Module1Module2

这部分参数是变化的,不可控的,因此对这两个模块进行 打桩,使用模拟的两个模块去替换原模块。

其中 MockModule1MockModule2 就是桩(stub)

MOCK

待补完...