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

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

阿神
阿神

闭关修行中......

全部回复(3)
阿神

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

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

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

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

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

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

巴扎黑

首先:

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

解决方法:

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

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

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

其次:

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

解决办法:

确定一个统一基准时间。

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号