首页 > 服务器程序依赖系统当前时间来做逻辑判断很不靠谱感觉,生产环境中是如何解决的?

服务器程序依赖系统当前时间来做逻辑判断很不靠谱感觉,生产环境中是如何解决的?

发现服务器上时间会被修改,有项目经验的能讲下实际生产环境中如何实现的吗?服务器程序依赖系统当前时间来做逻辑判断很不靠谱感觉。


首先:

时间从来就不是一个精确量,所以如果要求严格按照先后顺序来执行逻辑,不能按照时间进行判断;

解决方法:

生成能唯一标识先后顺序的sequence。

  1. 单机环境,这个很简单,不罗嗦;

  2. 分布式环境,(这个sequence必须是集中式的,也就是多台服务器共享的),然后每台服务器每次获取sequence值,然后根据序列值执行逻辑;

其次:

如果逻辑判断对时间的要求不是十分严格,也可按照时间先后顺序执行逻辑,但这个时间必须有一个统一的基准;

解决办法:

确定一个统一基准时间。

  1. 单机环境,这个同样很简单,不赘述;
  2. 分布式环境,可以确定集群中的某一台服务器作为时间服务器,以这台机器的时间为基准时间,其他所有服务器需要时间值,必须向这台时间服务器获取,再完备一点,时间服务器可以双机热备,主从同步,并可及时故障切换;

PS: 大多数架构,应用服务器都是多台机器分布式环境,数据库做冗余热备(彼此时间会同步),所以简单点的话,所有时间值都以数据库时间为准,每次需要时间值做逻辑判断时,都从数据库获取当前时间。


  1. 不同的机器可以会有不同的时间,即使时区都设置成一样的
  2. 用户可以很轻易的调整时间

因此,利用时间做一些先后顺序的判断是不可靠的
可以将其转化为唯一递增的序列号生成器,类似于数据库里面的id生成器一样
java里面可以是AtomicInteger,AtomicLong等
生成新的序列号之后将其写入文件,持久化下来
下次应用程序重新启动的时候,可以再次加载进来最后生成的序列号
这样就可以保证先后顺序了


我所知道的一般解决方案是服务器每天通过crontab定时向NTP服务器进行一次同步校验,如下:

0 23 * * * /usr/sbin/ntpdate asia.pool.ntp.org > /dev/null

OR,更好的方式是(据 @依云 评论):启动ntpd守护进程,使用方法Google一下有很多。

这样保证服务器时间的准确性,项目还是使用服务器的时间。

【热门文章】
【热门文章】