这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
雪花算法
Snowflake(雪花算法) 是用于分布式系统生成全局唯一 ID 值的算法
ID 结构
首位 0
Snowflake 生成的 ID 值为64bit 整型数据,因此二进制位首位 0 表示当前数值为正数
时间戳
41 bit 的时间戳,二进制表示最大为 毫秒,换算成年份,最大可以表示 69 年
机器 ID
10 bit 的机器 ID 值,最大标识 1024 台机器
ID 序号
序号表示,当前一毫秒内生成的第几个 ID
12 bit 的序号值,最大标识 4096 个 ID,当一毫秒内生成的 ID 数量超过 4096 就会转到下一毫秒生成
为什么使用雪花算法
- 生成的 ID 具有全局唯一性
- ID 序号可以保证生成的 ID 是递增的
- 不依赖数据库或者某一台机器,去中心化
- 一毫秒内最多生成 个 ID,容量大
缺陷
由雪花算法生成的 ID 结构可知,毫秒级时间戳和 ID 序号值受时钟影响
- 当多台机器的系统时钟不一致时,可能生成重复的 ID
- 由于某些原因,导致机器的系统时钟发生回拨,在回拨时间与当前时间的差值内也可能生成重复的 ID
解决时间回拨问题
待补完...
打桩和 MOCK
简介
模拟(mock) 被测试对象的依赖,来测试被测试对象
mock 的是依赖
无依赖的单元测试
在单元测试中,被测试对象内部已经包含了当前函数功能所需的所有参数,对外部无依赖。
无论外部因素如何变化,测试对象内部无论经过多少次运行,都会输出范围内的确定结果。
有依赖的单元测试
当被测试对象依赖外部结果时,对于外部依赖运行的结果不同,测试对象运行的结果可能不同。
在测试中,为保证测试函数的稳定性和幂等性,因此需要控制外部依赖的结果。
在开发过程中,可能由于外部依赖模块由其他人员编写,或者进度不统一等情况。在测试本模块时,需要开发人员手动模拟外部依赖的结果,这就是 mock 测试。
打桩(stub)
由图中
part1 与 part2 均是外部依赖传入的结果,分别依赖两个外部模块 Module1 与 Module2。
这部分参数是变化的,不可控的,因此对这两个模块进行 打桩,使用模拟的两个模块去替换原模块。
其中 MockModule1 与 MockModule2 就是桩(stub)
MOCK
待补完...