Ruby 分布式 ID 有什么好的建议

txbleehom · 2022年10月09日 · 最后由 suupic 回复于 2022年11月11日 · 1062 次阅读

公司产品做的 saas 平台,ID 生成方案没有采用数据库自增,目前使用的是雪花算法的 ruby 实现,线上跑的单机,偶尔并发高会出现重复 id 插入失败,不知道是不是多进程导致的,然后现在要考虑部署多机器,听说雪花算法在多机器下不是完全单调递增,只是整体是递增趋势,这对数据库查询性能是不是有影响,现在用下来考虑是不是要换其他方案,网上关于分布式 id 的有很多,但是没找到 ruby 的相关实现,不知道大家在 rails 项目里有用到分布式 id 吗,有没有好的推荐,感谢!

UUID 的方案应该不会遇到问题吧

线上跑的单机,偶尔并发高会出现重复 id 插入失败

多线程,需要锁。

这对数据库查询性能是不是有影响

没影响,数据是大体离散的。除非有非常特别的 query。

要不用 Redis INCR key 算了。Redis 单机性能可以 6w+,够用了。如果这个的 qps 10w+,当我没说。

yfractal 回复

Redis INCR key 就要做好数据的持久化以及高可用,不然要是宕机丢了一点点的数据,那就有点尴尬了,容易撞上

线上跑的单机,偶尔并发高会出现重复 id 插入失败

还有一种比较小的可能性是:服务器时钟回拨了。

xifengzhu 回复

哈哈哈哈,Redis 这种太粗糙了😂 只试用与可用性要求不高,还可以重试的场景。

自增加 hashid

lyfi2003 回复

UUID 的查询性能应该比较差,所以没采用

yfractal 回复

多台机器部署用 redis 也可以吗,每台机器间各自生成的 id 是否会冲突重复

hooopo 回复

自增 id 可以猜测数据,hashid 指的是什么,因为我还要考虑多机部署问题,多台机器生产唯一趋势递增 id

txbleehom 回复

https://hashids.org/ 就是你指定一个 salt,就可以把你的整数 ID 暴露给客户端一个类似 youtube 格式的 id。查询之前再通过 salt 反向解析回整数 id。

数据库多机部署就是想的有点多了,真到那个规模你有很多种分布式数据库或中间件可以选。。

hooopo 回复

这倒是个可以考虑的方案,目前只考虑程序部署多台服务器,数据库用的阿里 rds 暂不考虑多台问题

txbleehom 回复

这个 id 都是从一个 Redis 里拿。

我用的 instagram 的这个方案,直接丢给数据库了,migration 的时候调整一下就好了

https://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram

需要 登录 后方可回复, 如果你还没有账号请 注册新账号