[fea]
[driver]
[时间同步算法优化]
This commit is contained in:
yangyakun
2025-01-03 10:59:24 +08:00
parent b565b93100
commit 0e707da214
2 changed files with 59 additions and 14 deletions

View File

@@ -13,6 +13,26 @@ import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.utils.RxUtils
/**
* 当本地计算机客户端想要与NTP服务器同步时间时它会发送一个时间同步请求给NTP服务器。
* 在这个过程中,会有四个关键的时间戳被记录:
* T1客户端发送请求的时间。
* T2服务器接收到请求的时间。
* T3服务器发送响应的时间。
* T4客户端接收到响应的时间。
*
* 计算延迟时间Delay
* Delay是客户端和服务端之间的往返时间RoundTrip Time
* 计算公式为Delay = [(T4 - T1) - (T3 T2)]/2
*
* 计算时间偏差Offset
* Offset是客户端时间与服务器时间的偏差计算公式为
* Offset = T3 + Delay - T4 = [(T2 - T1) + (T3 T4)]/2
* 这个偏差可以是正数也可以是负数,表示客户端时间是快于还是慢于服务器时间。
*
*
*/
@Route(path = OchCommonConst.BIZ_TIME)
class TimeProvider : TimeService {
@@ -20,32 +40,55 @@ class TimeProvider : TimeService {
private val TAG = M_OCHCOMMON + "TimeProvider"
private var diffTime = 0L
private var offset = 0L
private var diffTimeGetTime = 0L
private var netTime = Long.MAX_VALUE
override fun loadNewTime() {
OchChainLogManager.writeChainLogTime("时间同步", "开始时间同步")
d(TAG, "时间同步_开始时间同步")
val startTime = System.currentTimeMillis()
val T1 = System.currentTimeMillis()
if (ProjectUtils.isSaas()) {
context?.let {
OchTimeServiceManager.queryTime(it,
object : OchCommonServiceCallback<TimeRespBean> {
override fun onSuccess(data: TimeRespBean?) {
val endTime = System.currentTimeMillis()
data?.data?.let { serverTime ->
val netTime = (endTime - startTime) / 2
val currentServerTime = serverTime + netTime
diffTime = currentServerTime - endTime
diffTimeGetTime = endTime
val T4 = System.currentTimeMillis()
var delay = 0L
data?.data?.let { T3 ->
delay = (T4 - T1) / 2
val currentNetTime = (T4-T1)
if(currentNetTime>netTime){
OchChainLogManager.writeChainLogTime(
"时间信息",
"时间延迟较上次大 放弃此次同步${currentNetTime}___上次同步网络延迟${netTime}"
)
return
}
netTime = currentNetTime
val currentServerTime = T3 + delay
offset = currentServerTime - T4
diffTimeGetTime = T4
}
OchChainLogManager.writeChainLogTime(
"时间信息",
"请求时间信息成功:${data};时间差是:${diffTime}"
"请求时间信息成功:${data};时间差是:${offset}"
)
d(TAG, "时间同步_请求时间信息成功:${data};时间差是:${diffTime}")
d(TAG, "时间同步_请求时间信息成功:${data};时间差是:${offset}_路上的时间:${delay}")
if(netTime>3_000){
// 网络延迟大 10s 同步一次
RxUtils.createSubscribeOnOwnThread(60_000) {
loadNewTime()
}
}else{
RxUtils.createSubscribeOnOwnThread(30*60_000) {
loadNewTime()
}
}
}
override fun onError() {
@@ -77,8 +120,8 @@ class TimeProvider : TimeService {
}
override fun getCurrentTimeStamp(): Long {
d(TAG,"获取时间_${System.currentTimeMillis() + diffTime}")
return System.currentTimeMillis() + diffTime
d(TAG,"获取时间_${System.currentTimeMillis() + offset}")
return System.currentTimeMillis() + offset
}
override fun getSynServerTime(): Long {
@@ -86,7 +129,7 @@ class TimeProvider : TimeService {
}
override fun getTimeStampDiff(): Long {
return diffTime
return offset
}

View File

@@ -20,7 +20,9 @@ object TimeManager {
fun load(){
OchChainLogManager.writeChainLogInit("初始化信息","初始化时间系统")
d(TAG,"初始化信息_初始化时间系统")
BizLoopManager.setLoopFunction(TAG, LoopInfo(60*2, TimeManager::loadNewTime,immediately = true, scheduler = Schedulers.io()))
BizLoopManager.runInIoThread{
loadNewTime()
}
}
fun loadNewTime(){