发现服务器上时间会被修改,有项目经验的能讲下实际生产环境中如何实现的吗?服务器程序依赖系统当前时间来做逻辑判断很不靠谱感觉。
首先:
时间从来就不是一个精确量,所以如果要求严格按照先后顺序来执行逻辑,不能按照时间进行判断;
解决方法:
生成能唯一标识先后顺序的sequence。
单机环境,这个很简单,不罗嗦;
分布式环境,(这个sequence必须是集中式的,也就是多台服务器共享的),然后每台服务器每次获取sequence值,然后根据序列值执行逻辑;
其次:
如果逻辑判断对时间的要求不是十分严格,也可按照时间先后顺序执行逻辑,但这个时间必须有一个统一的基准;
解决办法:
确定一个统一基准时间。
- 单机环境,这个同样很简单,不赘述;
- 分布式环境,可以确定集群中的某一台服务器作为时间服务器,以这台机器的时间为基准时间,其他所有服务器需要时间值,必须向这台时间服务器获取,再完备一点,时间服务器可以双机热备,主从同步,并可及时故障切换;
PS: 大多数架构,应用服务器都是多台机器分布式环境,数据库做冗余热备(彼此时间会同步),所以简单点的话,所有时间值都以数据库时间为准,每次需要时间值做逻辑判断时,都从数据库获取当前时间。
- 不同的机器可以会有不同的时间,即使时区都设置成一样的
- 用户可以很轻易的调整时间
因此,利用时间做一些先后顺序的判断是不可靠的
可以将其转化为唯一递增的序列号生成器,类似于数据库里面的id生成器一样
java里面可以是AtomicInteger,AtomicLong等
生成新的序列号之后将其写入文件,持久化下来
下次应用程序重新启动的时候,可以再次加载进来最后生成的序列号
这样就可以保证先后顺序了
我所知道的一般解决方案是服务器每天通过crontab定时向NTP服务器进行一次同步校验,如下:
0 23 * * * /usr/sbin/ntpdate asia.pool.ntp.org > /dev/null
OR,更好的方式是(据 @依云 评论):启动ntpd守护进程,使用方法Google一下有很多。
这样保证服务器时间的准确性,项目还是使用服务器的时间。