IT评测·应用市场-qidao123.com

标题: Go语言分布式ID生成策略优选:UUID、Snowflake、XID、ObjectID、Krand性能 [打印本页]

作者: 没腿的鸟    时间: 2025-3-11 19:34
标题: Go语言分布式ID生成策略优选:UUID、Snowflake、XID、ObjectID、Krand性能
在高并发应用场景下,如订单体系、分布式数据库主键、消息队列等,分布式ID的生成至关重要。本文将基于Go语言,对多种分布式ID生成方案举行基准测试(Benchmark),并分析其性能及适用场景,资助开辟者选择最优方案。
常见分布式ID生成方案

在Go语言生态中,常见的分布式ID生成方案包括:
基准测试代码

我们利用 testing.B 举行基准测试,代码如下:
  1. package main
  2. import (
  3.         "testing"
  4.         "github.com/bwmarrin/snowflake"
  5.         "github.com/go-dev-frame/sponge/pkg/krand"
  6.         "github.com/google/uuid"
  7.         "github.com/lithammer/shortuuid/v4"
  8.         "github.com/rs/xid"
  9.         "go.mongodb.org/mongo-driver/bson/primitive"
  10. )
  11. func BenchmarkXID(b *testing.B) {
  12.         for i := 0; i < b.N; i++ {
  13.                 xid.New().String()
  14.         }
  15. }
  16. func BenchmarkObjectID(b *testing.B) {
  17.         for i := 0; i < b.N; i++ {
  18.                 primitive.NewObjectID().Hex()
  19.         }
  20. }
  21. func BenchmarkSnowFlakeInt64(b *testing.B) {
  22.         node, _ := snowflake.NewNode(1)
  23.         for i := 0; i < b.N; i++ {
  24.                 node.Generate()
  25.         }
  26. }
  27. func BenchmarkKrandIDUint64(b *testing.B) {
  28.         for i := 0; i < b.N; i++ {
  29.                 krand.NewID()
  30.         }
  31. }
  32. func BenchmarkKrandIDString(b *testing.B) {
  33.         for i := 0; i < b.N; i++ {
  34.                 krand.NewStringID()
  35.         }
  36. }
  37. func BenchmarkUUID(b *testing.B) {
  38.         for i := 0; i < b.N; i++ {
  39.                 uuid.New().String()
  40.         }
  41. }
  42. func BenchmarkShotUUID(b *testing.B) {
  43.         for i := 0; i < b.N; i++ {
  44.                 shortuuid.New()
  45.         }
  46. }
复制代码
执行测试命令:
  1. go test -bench=. -benchmem
复制代码
测试效果分析

  1. goos: windows
  2. goarch: amd64
  3. pkg: id_test
  4. cpu: AMD Ryzen 7 6800H with Radeon Graphics
  5. BenchmarkXID-16                 43977468                27.54 ns/op            0 B/op          0 allocs/op
  6. BenchmarkObjectID-16            46614250                26.21 ns/op            0 B/op          0 allocs/op
  7. BenchmarkSnowFlakeInt64-16       4633701               258.4 ns/op             0 B/op          0 allocs/op
  8. BenchmarkKrandIDUint64-16       97430276                12.03 ns/op            0 B/op          0 allocs/op
  9. BenchmarkKrandIDString-16       24759777                43.70 ns/op           16 B/op          1 allocs/op
  10. BenchmarkUUID-16                 7194732               165.0 ns/op            64 B/op          2 allocs/op
  11. BenchmarkShotUUID-16             6521544               184.6 ns/op            40 B/op          2 allocs/op
复制代码
1. 性能最佳方案:Krand (Uint64)


2. 综合性能良好方案:MongoDB ObjectID、XID


3. 适用于大规模分布式体系:Snowflake


4. 适用于跨体系兼容:UUID、ShortUUID


最佳实践建议


结论

在分布式ID生成方案中,没有绝对的“最优”方案,只有“最适合”的方案。Krand 适用于高性能场景,XID 分身性能和可读性,而 Snowflake 适用于大规模分布式体系。开辟者应根据业务需求选择最优方案,以提升体系的稳固性和性能。

   Sponge 是一个强大的 Go 开辟框架,其核生理念是通过解析 SQL、Protobuf、JSON 文件逆向生成模块化代码,这些代码可机动组合成多种类型的完备后端服务。Sponge 提供一站式项目开辟解决方案,涵盖代码生成、开辟、测试、API 文档生成和部署等方面,明显提升开辟效率,降低开辟难度,实现以"低代码"方式构建高质量企业级项目。Sponge与内置的DeepSeek R1助手协同重构传统开辟范式,打造极速开辟体验。
  Sponge Github 地点: https://github.com/go-dev-frame/sponge

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4