如何保证各个节点的时间一致性
来源:10-2 课程总结&课后练习
慕函数7881054
2019-02-26
看到代码中有一段随机上锁
// 上锁
// 随机睡眠(0~1s)
//time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
之前还没有想明白,发现每次都会并发执行,以为是代码哪里出错了
最后才明白,是因为定时,到了时间执行完了,然后释放了锁和租约。
然后因为随机睡眠了,后面的节点执行的时候发现锁已经释放了,然后就又执行了一遍。
那么,问题来了,如果服务器很多,而且部署在各个机房,应用也被部署在各个机房,如果如何保证时间的一致性,保证不了时间的一致性,就可能并发执行。
之前看到谷歌的机房部署在世界各地,有些机房还在太空之中,因为太空中的卫星上的运行速度很快,根据狭义相对论,运行速度越快时间越慢,一年下来时间就会相差几毫秒,谷歌简单粗暴的方式就是用原子钟来校对时间,取一个统一的时间。
那么如果在项目中需要保证时间的一致性,需要如何去做?
写回答
1回答
-
1,校准时间在linux下是依靠ntp守护服务实现的,误差通常很小,我们只需要给予一定的随机打乱即可,不需要下太多功夫。
2,因为任务通常不是瞬间退出的,所以多个worker因时间误差接二连三调度的情景是可以容忍的(PS:任务需要自己做幂等性,就像一个对账任务启动后应该先检查之前对账是不是已经做完了一样)。
3,我们用多牛逼的技术,都需要考虑成本,能把问题解决,同时保障系统简单可靠就很好了。更为复杂的架构就是中心调度,需要master直接在etcd中调配任务到具体worker,这种情况下异常case会增多,所以课程并没有做这种方案。
022019-03-08
相似问题