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