京东原文: 京东短网址高可用提升最佳实践 | 京东云技术团队 - 知乎
因这是京东内部系统,不清楚具体实现,根据其文章流程图梳理出其架构
业务方通过短链服务提供的sdk将长链转换为短链,结构如下
目前疑问:难点就是如何复用之前的号段
先来梳理一下文章中的一些内容,上面截了两张图,从中可以得知:
以上几点是根据文章推断出来的,再补充一个:短链服务记录每天使用的id开始与结束(只要派发给业务方即记录)
得到以上几点信息,我们可以做一个 回收池(拿5位短链举例):
????????例如:5位短链一天9千万数据,假设第一天的短链全都都没使用,按最大派发值来算:90000000/1000=90000,也仅仅会生成9万数据,如需减少扫描区间到100,一 天也只会生产90万数据,对比之前的9千万条数据,性能提升了百倍千倍
改造后流程(拿5位短链举例):
可优化的点:
????????????????举例:5位短链因数量少可以减少扫描区间提高复用率,而6/7位短链非常多,则可以按最大派发值来提升扫描性能
扫描策略优化:
????????同样先说痛点(拿5位短链举例):一天最大过期9千万条,对于上述的流程:是拿每天记录的beginNum 和 endNum去拆分区间值去redis中批量扫描,这种效率当然低下,本质上还是让redis帮我们查了9千万数据,即使网络IO可能只有9万次(1000一次条),但是这里有两个问题:
优化方案:
????????key(短链)value(长链),改造成:key(短链)value(长链,所处区间段[例如:0-1000])
????????现再次基础上改造value,同时向redis中再写一条 区间映射 ,过期时间和当前set的短链映射时间保持一致
????????key(0-1000) value(当前时间)
????????在此基础上,再将第二步所描述的 区间映射也续期N天,保持一致
优化前后对比(5位短链举例):
????????优化前:需要调redis9万次,每次传输1000个key,每次redis响应也最大1000个value,占用大量带宽,拖累redis正常执行
????????优化后:需要调redis9万次,每次传输1个key,每次redis响应1个value
到此完毕。