bwmarrin / snowflake

A simple to use Go (golang) package to generate or parse Twitter snowflake IDs
BSD 2-Clause "Simplified" License
2.98k stars 371 forks source link

生成的ID会重复 #39

Closed mztlive closed 2 years ago

mztlive commented 2 years ago

func NextIdentity() (int64, error) { //TODO: NodeID 换成读取配置 node, err := snowflake.NewNode(1)

if err != nil {
    Logger().Info(
        "Generate identity fail.",
        zap.String("error", err.Error()),
    )
}

ID := node.Generate()
return ID.Int64(), nil

}

r.GET("/testOrder", func(c *gin.Context) { fmt.Println(utils.NextIdentity()) }

ab -c 10 -n 11 http://localhost:8080/testOrder

就在10个并发的时候就会重复

zhangyi176 commented 2 years ago

snowflake.NewNode(1) 这部分要提前完成,仅在程序启动时初始化一次,后面再使用node.Generate()。

54huige commented 2 years ago

用单例模式吧

alaywn commented 2 years ago

用单例模式吧

怎么算单例模式?启动服务的全局初始化一次snowflake.NewNode么?

CarsonSlovoka commented 2 years ago

有點驚訝,issues不多,但是光用中文下標題的就佔兩個了,是因為作者群裡面有人看得懂中文還是圖方便就用中文問而已?


另外我覺得2樓已經給了解答,因此這個issues可以考慮關閉了

snowflake.NewNode(1) 这部分要提前完成,仅在程序启动时初始化一次,后面再使用node.Generate()。

CarsonSlovoka commented 2 years ago

用单例模式吧

怎么算单例模式?启动服务的全局初始化一次snowflake.NewNode么?

這樣是單例

n := snowflake.NewNode(1)
n.Generate()
n.Generate()
n.Generate()

這樣不是

n := snowflake.NewNode(1)
n.Generate()
n = snowflake.NewNode(1)
n.Generate()

如果不斷產生Node的新對象,這樣有Lock等於沒Lock,可以看一下代碼

bwmarrin commented 1 year ago

有點驚訝,issues不多,但是光用中文下標題的就佔兩個了,是因為作者群裡面有人看得懂中文還是圖方便就用中文問而已?

Thanks for helping on this issue. Because I'm over here using Google Translate to try to understand what any of this says :)

Definitely no authors (only me) that understands Chinese.