java - 服务器程序依赖系统当前时间来做逻辑判断很不靠谱感觉,生产环境中是如何解决的?
阿神
阿神 2017-04-17 11:13:04
0
3
324

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

阿神
阿神

闭关修行中......

Antworte allen (3)
阿神

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

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

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

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

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

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

      巴扎黑

      首先:

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

      解决方法:

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

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

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

      其次:

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

      解决办法:

      确定一个统一基准时间。

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

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

        Neueste Downloads
        Mehr>
        Web-Effekte
        Quellcode der Website
        Website-Materialien
        Frontend-Vorlage
        Über uns Haftungsausschluss Sitemap
        Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!