引入:

时钟同步一直是一个比较热的话题。因为它涉及到许多具体场景。

场景A: 2个系统做交易,A系统下订单,B系统管理订单。结果因为B系统比A慢5分钟,A下单完了,B获得的时间居然是一个未来的时间。

场景B: 搞双十一了,某公司的网上电子商城需要在11月11北京时间凌晨0点启用应急预案,然后启用强大的促销规则。结果因为时钟比北京时间慢了10分钟。等11月11零点,大量抢购的人一下子拥入网上电子商城,造成该公司访问量的“井喷”式的增长,但是因为服务器还在11月10日晚上23:50,所以没有启用应急预案,也没有使用促销规则。结果服务器挂了,客户跑了。。。

解决方案:

以上就是目前一些非常典型的时钟不同步的例子:

对于场景A,一般做法是吧某台服务器作为中央时钟服务器,让其作为标准的时钟服务器。然后确保所有服务器都可以访问此中央时钟服务器,并且依次在每台需要时钟同步的机器上运行命令 ntpupdate <时钟服务器IP>即可。

但是场景A有一个致命缺陷就是所有的服务器都必须能连接到时钟服务器。这对于大型企业有多个区段划分,彼此多个网段,网段之间相互又不通的情况,无法解决。那么在联网的情况下,这里有一个变通的轻量级的方法,可以让所有服务器(尤其是服务器上运行着代码的地方),和北京时间同步,这种解决方案也许更加适合场景B。

这里我写了一个工具类,它可以有效的和北京时间同步,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.charles.study;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
/**
 * 这个工具类用于获得标准的北京时间
 * @author charles.wang(mailto:charles_wang888@126.com)
 *
 */
public class BeijingDateTimeUtil {
     
    private BeijingDateTimeUtil(){}
     
     
    public static final String BEIJING_TIME_SERVICE_URL="http://www.beijing-time.org/time.asp";
    public static final String BEIJING_TIME_ZONE = "GMT+8";
     
     
    /**
     * retrieve the standard beijing time by beijing time service
     * @return Calendar which stands for current beijing time
     */
    public static Calendar retrieveBeijingStandardDatetime() {
         
        try{
             
             
        //access the webpage which can provide precise beijing-time    
        URL url = new URL(BEIJING_TIME_SERVICE_URL);
        HttpURLConnection uc = (HttpURLConnection) url.openConnection();
        uc.connect();
         
        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
         
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
         
        String beijingTimeInfoString = sb.toString();
        String[] infos = beijingTimeInfoString.split(";");
         
        //split information which can stand for year/month/day/dayOfWeek/hour/minute/second
        int year         = Integer.parseInt(infos[1].substring(infos[1].indexOf("=")+1));
        int month        = Integer.parseInt(infos[2].substring(infos[2].indexOf("=")+1));
        int day          = Integer.parseInt(infos[3].substring(infos[3].indexOf("=")+1));
        int dayOfWeek    = Integer.parseInt(infos[4].substring(infos[4].indexOf("=")+1));
        int hour         = Integer.parseInt(infos[5].substring(infos[5].indexOf("=")+1));
        int minute       = Integer.parseInt(infos[6].substring(infos[6].indexOf("=")+1));
        int second       = Integer.parseInt(infos[7].substring(infos[7].indexOf("=")+1));
         
        //create a calendar object 
        //make sure that (1)using Beijing timezone
        //               (2)month starts from 0 instead of 1
        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(BEIJING_TIME_ZONE));
        cal.set(year,month-1,day,hour,minute,second);
        return cal;
         
        }catch(MalformedURLException ex){
            ex.printStackTrace();
            return null;
        }catch(IOException ex){
            ex.printStackTrace();
            return null;
        }
         
    }
     
     
     
    public static void main(String [] args) {
         
         
        Calendar beijingCalendar = retrieveBeijingStandardDatetime();
        if(beijingCalendar!=null){
            Date beijingDatetime = beijingCalendar.getTime();
            DateFormat df =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
            String dateFormatStr  = df.format(beijingDatetime);
            System.out.println("Beijing Current Datetime:"+dateFormatStr);
        }else{
            System.out.println("BeijingTime service not available");
        }    
         
    }
}

执行示例代码中的测试,我们可以看到:

这里也可以看出,我的笔记本时间比北京时间快9秒。

本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1584883,如需转载请自行联系原作者

时钟同步和时钟修正的小技巧相关推荐

  1. I2C(IIC)的仲裁、时钟同步和时钟扩展

    I2C(IIC)的仲裁.时钟同步和时钟扩展 注意,CSDN以及博客园上有大量抄袭和以讹传讹的情况,注意鉴别. 本文参考了Philip的I2C specification以及wiki pedia,并且通 ...

  2. 以太网的时钟同步(1588时钟)

    IEEE1588 标准定义了一个在测量和自动化系统中的时钟同步协议.该协议特别适合于以太网,可以实现微秒级高精度的时钟同步. 以太网的时钟同步 IEEE1588 定义了一个在测量和控制网络中,与网络交 ...

  3. 坚果云同步linux,#坚果云每日小技巧分享# 你们要的“选择性同步”越狱啦!

    原标题:#坚果云每日小技巧分享# 你们要的"选择性同步"越狱啦! 自从坚果云同步盘推出云桥模式之后,选择性同步被我们的产品经理关进了大牢,这让我们很多选择性同步的用户感到不适应,并 ...

  4. 坚果云与服务器同步数据,#网盘每日小技巧分享# 如何在坚果云和服务器之间更好地同步数据?...

    原标题:#网盘每日小技巧分享# 如何在坚果云和服务器之间更好地同步数据? 我们有很多用户利用坚果云在服务器之间同步数据,因为数据格式原因,出现了不少问题,影响用户体验. 其实,微软本身就推出了robo ...

  5. 分布式系统-同步化-时钟同步-物理时钟与Lamport时间戳(逻辑时钟)

    1.概述 同步化是分布式系统中的一个重要概念,同步化主要解决的是排序问题.例如:多个线程不能同时操作一个变量,而是将多个线程使用锁或无锁结构进行同步,同步的目的就是将多个线程排序为一个操作时序对这个变 ...

  6. Linux NTP时钟同步

    一.为什么要了解时钟同步? 时钟同步在大数据方向,用到的地方很多.举个例子来说吧,像Zookeeper.RegionServer服务都是需要实时和各节点进行通信的.假如各节点差超过30s,那么Regi ...

  7. 计算机网络时钟同步怎么理解,时钟与计算机网络中的时钟同步.pdf

    时钟与计算机网络中的时钟同步.pdf 时钟与计算机网络中的时钟同步 冯 积 社 (西安交通大学软件学院 陕西西安 710049) 计算机中的时钟 的时钟都会产生 几乎所有的计算机中都会有专用线路用于计 ...

  8. linux桌面环境调整时钟,小技巧:Linux个性化面版时钟显示

    默认情况下,GNOME桌面的面版的时钟小程序只有少许的可控制选项,我们只能选择12/24制式,或者选择日期/秒针的显示. 现在,这则小技巧让你完全自由的控制你的时钟显示. 首先打开终端或按Alt+F2 ...

  9. linux将时钟放在桌面上的,小技巧:Linux个性化面版时钟显示

    默认情况下,GNOME桌面的面版的时钟小程序只有少许的可控制选项,我们只能选择12/24制式,或者选择日期/秒针的显示. 现在,这则小技巧让你完全自由的控制你的时钟显示. 首先打开终端或按Alt+F2 ...

最新文章

  1. Spring框架是怎么解决Bean之间的循环依赖的 (转)
  2. 检查压缩包是否损坏_修复损坏的gzip压缩文件之原理篇
  3. java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...
  4. C++二维码相关库编译
  5. Python小游戏(贪吃蛇)
  6. hdu2553 N皇后问题-dfs回溯剪枝+打表
  7. jQuery keyup事件
  8. 微信小程序轮播图实现(超简单)
  9. Linux核心进程管理命令
  10. 混合动力hev汽车控制模型 simulink stateflow搭建 电机 电池 发动机 模型 动力分配 能量控制策略 及 经济性仿真测试。
  11. 【Ubuntu】QT程序 could not find or load the Qt platform plugin “xcb“ in “报错解决
  12. 【Matplotlib设置】Python绘图全局字体改为 Times New Roman
  13. 【Python讲义】WEEK 8
  14. 2022.11.16 英语背诵
  15. APScheduler如何设置任务不并发(即第一个任务执行完再执行下一个)?
  16. 降低屏幕亮度,减缓眼疲劳 (linux/windows/firefox/android)
  17. SEVERE: Error configuring application listener of
  18. Java用20行代码实现抖音小视频批量转换为gif动态图【值得收藏】
  19. 淘宝内容场下的人物理解系统
  20. python HEIC 转jpg

热门文章

  1. 复兴or幻象?VR的2021三重门
  2. 解决AI大难题:如何降低AI运行对能源的消耗?
  3. 北京发自动驾驶车辆考试大纲 难度堪比普通人考驾照
  4. 推动大数据和AI应用场景的落地,加速实现与产业融合。
  5. AI、区块链和机器人:技术会让未来的工作发生什变化?
  6. 年度最理性 AI 分析文章:预测 AI 未来,大部分人陷入了 7 大误区
  7. 阿里、腾讯基本薪资曝光,资深算法工程师24万美元,高级研究员26万美元
  8. 一个 Babelfish ,看懂云数据库的发展方向
  9. 有点酸!中外程序员都是怎么炫富的? | 每日趣闻
  10. 90% 的人都会!这项能力已成标配,系统学习才能破局!