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

txbleehom · October 09, 2022 · Last by suupic replied at November 11, 2022 · 1049 hits

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

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

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

多线程,需要锁。

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

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

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

Reply to yfractal

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

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

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

Reply to xifengzhu

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

自增加 hashid

Reply to lyfi2003

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

Reply to yfractal

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

Reply to hooopo

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

Reply to txbleehom

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

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

Reply to hooopo

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

Reply to txbleehom

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

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

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

You need to Sign in before reply, if you don't have an account, please Sign up first.