refactor(config): 统一使用应用服务器时间
- 删除 dao.Now(),不再额外执行 SELECT NOW(3) - 配置写入、历史记录和增量游标全部使用 time.Now() - 移除数据库时间获取失败的错误分支
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
package dao
|
package dao
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"kenaito-conf/server/internal/config"
|
"kenaito-conf/server/internal/config"
|
||||||
"kenaito-conf/server/internal/model"
|
"kenaito-conf/server/internal/model"
|
||||||
"kenaito-conf/server/internal/util"
|
"kenaito-conf/server/internal/util"
|
||||||
@@ -99,25 +98,3 @@ func initSeedData() error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now 返回数据库当前时间(毫秒精度),用于增量同步游标和 updated_at 写入。
|
|
||||||
// 统一使用数据库时间可以避免多实例应用服务器之间的时钟偏差。
|
|
||||||
func Now() (time.Time, error) {
|
|
||||||
rows, err := Engine.DB().Query("SELECT NOW(3)")
|
|
||||||
if err != nil {
|
|
||||||
return time.Time{}, err
|
|
||||||
}
|
|
||||||
defer rows.Close()
|
|
||||||
|
|
||||||
var now time.Time
|
|
||||||
if !rows.Next() {
|
|
||||||
if err := rows.Err(); err != nil {
|
|
||||||
return time.Time{}, err
|
|
||||||
}
|
|
||||||
return time.Time{}, errors.New("no database time result")
|
|
||||||
}
|
|
||||||
if err := rows.Scan(&now); err != nil {
|
|
||||||
return time.Time{}, err
|
|
||||||
}
|
|
||||||
return now, nil
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"kenaito-conf/server/internal/dao"
|
"kenaito-conf/server/internal/dao"
|
||||||
"kenaito-conf/server/internal/logger"
|
|
||||||
"kenaito-conf/server/internal/middleware"
|
"kenaito-conf/server/internal/middleware"
|
||||||
"kenaito-conf/server/internal/model"
|
"kenaito-conf/server/internal/model"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -259,12 +258,7 @@ func (h *AppHandler) Delete(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
now, err := dao.Now()
|
now := time.Now()
|
||||||
if err != nil {
|
|
||||||
logger.SugaredLogger.Errorf("[AppHandler.Delete] get database time error: %v", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, model.WrapperResponse{Code: 500, Msg: "删除失败"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
app.Enabled = false
|
app.Enabled = false
|
||||||
app.UpdatedBy = userInfo.Name
|
app.UpdatedBy = userInfo.Name
|
||||||
|
|||||||
@@ -202,12 +202,7 @@ func (h *ConfigHandler) Add(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
now, err := dao.Now()
|
now := time.Now()
|
||||||
if err != nil {
|
|
||||||
logger.SugaredLogger.Errorf("[ConfigHandler.Add] get database time error: %v", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, model.WrapperResponse{Code: 500, Msg: "保存失败"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
config := model.AppConfig{
|
config := model.AppConfig{
|
||||||
GroupId: req.GroupId,
|
GroupId: req.GroupId,
|
||||||
@@ -278,12 +273,7 @@ func (h *ConfigHandler) Update(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
now, err := dao.Now()
|
now := time.Now()
|
||||||
if err != nil {
|
|
||||||
logger.SugaredLogger.Errorf("[ConfigHandler.Update] get database time error: %v", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, model.WrapperResponse{Code: 500, Msg: "保存失败"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// save history
|
// save history
|
||||||
h.saveHistory(&config, userInfo.Name, "update", now)
|
h.saveHistory(&config, userInfo.Name, "update", now)
|
||||||
@@ -317,12 +307,7 @@ func (h *ConfigHandler) Delete(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
now, err := dao.Now()
|
now := time.Now()
|
||||||
if err != nil {
|
|
||||||
logger.SugaredLogger.Errorf("[ConfigHandler.Delete] get database time error: %v", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, model.WrapperResponse{Code: 500, Msg: "删除失败"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 记录删除前的配置内容
|
// 记录删除前的配置内容
|
||||||
h.saveHistory(&config, userInfo.Name, "delete", now)
|
h.saveHistory(&config, userInfo.Name, "delete", now)
|
||||||
@@ -433,12 +418,7 @@ func (h *ConfigHandler) Rollback(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
now, err := dao.Now()
|
now := time.Now()
|
||||||
if err != nil {
|
|
||||||
logger.SugaredLogger.Errorf("[ConfigHandler.Rollback] get database time error: %v", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, model.WrapperResponse{Code: 500, Msg: "回滚失败"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 记录回滚前的配置内容
|
// 记录回滚前的配置内容
|
||||||
h.saveHistory(&config, userInfo.Name, "rollback", now)
|
h.saveHistory(&config, userInfo.Name, "rollback", now)
|
||||||
|
|||||||
@@ -96,13 +96,8 @@ func (h *ConfigApiHandler) FetchAllConfigs(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 游标上界取查询前的数据库时间,保证查询期间发生的更新会在下次增量中返回
|
// 游标上界取查询前的当前时间,保证查询期间发生的更新会在下次增量中返回
|
||||||
upperBound, err := dao.Now()
|
upperBound := time.Now()
|
||||||
if err != nil {
|
|
||||||
logger.SugaredLogger.Errorf("[FetchAllConfigs] get database time error: %v", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, model.WrapperResponse{Code: 500, Msg: "服务暂时不可用"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
result := make(map[string]interface{})
|
result := make(map[string]interface{})
|
||||||
var configIds []int
|
var configIds []int
|
||||||
@@ -195,14 +190,8 @@ func (h *ConfigApiHandler) FetchChangedConfigs(c *gin.Context) {
|
|||||||
|
|
||||||
lastUpdateTime := time.UnixMilli(req.LastTime)
|
lastUpdateTime := time.UnixMilli(req.LastTime)
|
||||||
|
|
||||||
// 以数据库时间为本次查询的固定上界,避免查询与游标生成之间的竞态,
|
// 以当前时间为本次查询的固定上界,避免查询与游标生成之间的竞态
|
||||||
// 同时避免多实例应用服务器的时钟偏差。
|
upperBound := time.Now()
|
||||||
upperBound, err := dao.Now()
|
|
||||||
if err != nil {
|
|
||||||
logger.SugaredLogger.Errorf("[FetchChangedConfigs] get database time error: %v", err)
|
|
||||||
c.JSON(http.StatusInternalServerError, model.WrapperResponse{Code: 500, Msg: "服务暂时不可用"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
result := make(map[string]string)
|
result := make(map[string]string)
|
||||||
var configIds []int
|
var configIds []int
|
||||||
|
|||||||
Reference in New Issue
Block a user