看到代码中有一段随机上锁
// 上锁
// 随机睡眠(0~1s)
//time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
之前还没有想明白,发现每次都会并发执行,以为是代码哪里出错了
最后才明白,是因为定时,到了时间执行完了,然后释放了锁和租约。
然后因为随机睡眠了,后面的节点执行的时候发现锁已经释放了,然后就又执行了一遍。
那么,问题来了,如果服务器很多,而且部署在各个机房,应用也被部署在各个机房,如果如何保证时间的一致性,保证不了时间的一致性,就可能并发执行。
之前看到谷歌的机房部署在世界各地,有些机房还在太空之中,因为太空中的卫星上的运行速度很快,根据狭义相对论,运行速度越快时间越慢,一年下来时间就会相差几毫秒,谷歌简单粗暴的方式就是用原子钟来校对时间,取一个统一的时间。
那么如果在项目中需要保证时间的一致性,需要如何去做?