fix: 修复snowflake节点并发初始化问题

This commit is contained in:
2026-06-06 14:34:33 +08:00
parent 91359f61ac
commit 0ddc2f17b9

View File

@@ -7,6 +7,7 @@ import (
"fmt"
"regexp"
"strings"
"sync"
"time"
"gitea.com/red-future/common/beans"
@@ -29,8 +30,28 @@ import (
var (
localCache *gcache.Cache
snowflakeNode *snowflake.Node
snowflakeOnce sync.Once
)
func init() {
ctx := context.Background()
snowflakeOnce.Do(func() {
nodeId := genv.Get("APP_NODE", 1).Int64()
// 安全范围 0~1023
if nodeId < 0 || nodeId > 1023 {
nodeId = 1
}
node, err := snowflake.NewNode(nodeId)
if err != nil {
g.Log().Errorf(ctx, "snowflake init failed: %v", err)
return
}
snowflakeNode = node
})
}
// getLocalCache 获取本地缓存实例
func getLocalCache() *gcache.Cache {
if localCache == nil {
@@ -166,17 +187,8 @@ func insertHook(ctx context.Context, in *gdb.HookInsertInput) (result sql.Result
return nil, err
}
// 懒加载初始化全局snowflake节点只创建一次
if snowflakeNode == nil {
nodeId := genv.Get("APP_NODE", "").Int64()
if g.IsEmpty(nodeId) {
nodeId = 1
}
node, err := snowflake.NewNode(nodeId)
if err != nil {
return nil, err
}
snowflakeNode = node
if g.IsEmpty(snowflakeNode) {
return nil, fmt.Errorf("snowflakeNode is nil")
}
for i := range in.Data {