Leaf icon indicating copy to clipboard operation
Leaf copied to clipboard

如何用Leaf生成单调递增的序列呢?

Open lafangs opened this issue 6 years ago • 8 comments

好比这样的结果:1,2,3,4,即便中间断开了也没关系,但不希望是1,100,2,3,101这样的趋势递增。 个人想到的解决方案 1、直接访问数据库,获取数据库的自增Id,但是每次都要访问数据库,性能有瓶颈 2、不要部署两个Leaf Server,只部署一台Leaf Server,每次从这一台取id,就单调递增了,但是有单点风险 请问有啥好的解决方案吗?谢谢!

lafangs avatar Feb 13 '20 04:02 lafangs

要保证你的客户端线程请求必须是串行的,不然到了你客户端也不一定是递增的

Yaccc avatar Feb 14 '20 03:02 Yaccc

leaf本身就不支持单调递增id。

thelight1 avatar Mar 18 '20 07:03 thelight1

下面是我对leaf实现单调递增id的一些思考,可以看到实现单调递增还是很麻烦的。 而且从美团内部对唯一id需求来看,大部分业务只需要id唯一即可,单调递增并不是强需求。

========================================= 如何保证获取到的id单调递增? 约束条件: 1)集群中一台机器为Master,仅Master提供id生成服务 2)当获取id的请求路由到Master机器时,直接返回响应(一轮RPC) 当获取id的请求路由到非Master机器时,转发至Master机器(两轮RPC)

评估: 性能方面: 1)请求最终由Master机器进行响应。单机能支持的最大QPS即为集群最大QPS。 2)请求路由到非Master机器时,需两轮RPC,会增加耗时。 3)请求最终由Master机器进行响应,导致同机房优先路由策略不适用,某些情况下,请求耗时较长。 扩展性方面: 集群总QPS无法随集群机器数量的增加而线性扩展 可用性方面: 1)当发生Master切换时,会损失一定可用性 2)某些情况下,请求耗时较长,会导致可用性降低。

thelight1 avatar Mar 18 '20 07:03 thelight1

上面思路都不是很好,还有其他更好思路么

simake2017 avatar Jun 01 '20 07:06 simake2017

可否前面加一个路由网关,而根据key进行路由到某一台leaf 节点上,做到顺序递增

simake2017 avatar Jun 01 '20 07:06 simake2017

绝对全局连续单调递增的ID(DB表主键)生成决方案??: 绝对全局连续单调递增的方案不存在。 要么总体有序,在各个库趋势递增;要么各个库内连续有序,但各部分DB1<DB2<DB3(因为区分DB的区号放在高位)。 以下有一种思路, 希望交流. 参考: https://github.com/automvc/honey/blob/master/src/main/java/org/teasoft/honey/distribution/SerialUniqueId.java

automvc avatar Jun 21 '20 14:06 automvc

全局ID单调递增(性能)问题,可以最终简化为(分布式/高性能)文件系统的读写原子性问题。比如一个文件记录着当前最大ID。

若可如此推导,那么Leaf项目就没有意义了。

综上,我们无需在Leaf项目中讨论全局ID单调递增。

tudyzhb avatar Sep 08 '23 07:09 tudyzhb

如果使用了这种趋势递增ID 插入数据库的记录 会不会造成性能影响,因为不是严格自增,会很容易产生不同的物理页

yukunqi avatar Sep 20 '23 06:09 yukunqi