公司产品做的 saas 平台,ID 生成方案没有采用数据库自增,目前使用的是雪花算法的 ruby 实现,线上跑的单机,偶尔并发高会出现重复 id 插入失败,不知道是不是多进程导致的,然后现在要考虑部署多机器,听说雪花算法在多机器下不是完全单调递增,只是整体是递增趋势,这对数据库查询性能是不是有影响,现在用下来考虑是不是要换其他方案,网上关于分布式 id 的有很多,但是没找到 ruby 的相关实现,不知道大家在 rails 项目里有用到分布式 id 吗,有没有好的推荐,感谢!
线上跑的单机,偶尔并发高会出现重复 id 插入失败
多线程,需要锁。
这对数据库查询性能是不是有影响
没影响,数据是大体离散的。除非有非常特别的 query。
要不用 Redis INCR key 算了。Redis 单机性能可以 6w+,够用了。如果这个的 qps 10w+,当我没说。
Redis INCR key 就要做好数据的持久化以及高可用,不然要是宕机丢了一点点的数据,那就有点尴尬了,容易撞上
https://hashids.org/ 就是你指定一个 salt,就可以把你的整数 ID 暴露给客户端一个类似 youtube 格式的 id。查询之前再通过 salt 反向解析回整数 id。
数据库多机部署就是想的有点多了,真到那个规模你有很多种分布式数据库或中间件可以选。。
我用的 instagram 的这个方案,直接丢给数据库了,migration 的时候调整一下就好了
https://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram