skynet中使用uuid库

skynet中使用uuid库

最近在使用之前一位同学写的uuid库时发现了uuid在不通的skynet虚拟机中可能会产生相同的值的现象,这里记录一下。产生的原因是,这2个虚拟机是在服务启动的时候创建的,间隔时间很短,随机种子估计是一样的。后面产生的随机序列都是一样的。

uuid库初始化种子

相同时间初始化种子,后续产生的随机数是相同的,随机种子初始化代码如下:

1
2
local uuid = require "uuid"
uuid.seed() -- 初始化uuid种子

不同lua虚拟机中使用uuid可能生成相同的uuid,下面就是2个skynet服务在相同时间创建并初始化uuid种子的例子,不难看出,2个服务轮询接受请求,依次产生的uuid是相同的。

1
2
3
4
[:0000001a] [2022-07-29 11:36:36.561] [W] [login_web_agent1] service/login/platform/account_login.lua:111: req: 40a1bbf6-2e44-4b4a-cb9d-7a383472184b
[:0000001b] [2022-07-29 11:36:44.059] [W] [login_web_agent2] service/login/platform/account_login.lua:111: req: 40a1bbf6-2e44-4b4a-cb9d-7a383472184b
[:0000001a] [2022-07-29 11:36:55.069] [W] [login_web_agent1] service/login/platform/account_login.lua:111: req: bc96f82f-c94c-4398-c346-e956a92dcc11
[:0000001b] [2022-07-29 11:41:13.213] [W] [login_web_agent2] service/login/platform/account_login.lua:111: req: bc96f82f-c94c-4398-c346-e956a92dcc11

总结

这个uuid库的使用需要保证uuid的使用是在一个虚拟机内。如果想uuid不重复,又要保证唯一性,可以创建一个专有的skynet虚拟机来提供uuid的分配工作。