京东短网址高可用提升最佳实践

京东,网址,可用,提升,最佳,实践 · 浏览次数 : 1292

小编点评

## **短码生成流程优化** **1. 自增算法** * 使用**缓存发号加内存自增**方式,降低碰撞率。 * **缓存取号**依赖缓存保证分布式发号无碰撞。 * **保障机制**确保生成的号码都在短网址对应长度的号码总容量范围内。 **2. 性能优化** * **优化接口性能**,提升性能近乎内存。 * **优化单机承载量**,提升性能20倍以上。 * **优化数据库性能**,解决业务调用缓慢及超时的痛点。 * **优化生成服务性能**,解决短码越积越多导致的数据量太大及性能下降。 **3. 效率提升** * **利用容量规划及过期时间机制**,实现号段循环重复利用。 * **利用Redis原子**,减少redis请求。 * **利用Redis.set原子**检测key不存在时才能设置成功。 **4. 技术细节** * **分布式无碰撞**算法利用redis的incrby实现分布式号段发放。 * **原子id自增**减少redis请求。 * **使用Redis.set原子**检测key不存在时才能设置成功。 * **利用Redis.set原子**检测key不存在时才能设置成功。 **5. 优化策略** * **排版内容**,提升页面效率。 * **优化图片大小**,减少图片加载时间。 * **优化脚本**,减少脚本运行时间。 * **使用缓存技术**,降低数据库访问次数。

正文

作者:京东零售 郝彦军

什么是短网址?

短网址,是在长度上比较短的网址。简单来说就是帮您把冗长的URL地址缩短成8个字符以内的短网址。

当我们在腾讯、新浪发微博时,有时发很长的网址连接,但由于微博只限制140个字,所以微博就自动把您发的长网址给转换成短网址了。在微博和手机短信提醒等限制字数的地方来使用短网址,的确是一个不错的方案。

短网址通常使用“短域名/短码”的形式,打开短网址网页会直接跳转到长网址页面。例:3.cn/CdEyF2t.cn/RlB2PdDdwz.cn/134128 等短网址,分别是由以下短网址服务缩短后的网址 京东短网址:http://s.3.cn/, 新浪短网址:https://sina.lt/ ,百度短网址:http://dwz.cn/

短网址服务主要包含功能: 生成短网址(长网址缩短)、二维码简化、修改短网址、短网址跳转(访问短网址跳转到长网址)、唤醒APP、短网址统计 等。

短网址能解决什么问题?

长网址存在的问题:

1、长网址的长度太长,下面的长网址,共记312个字符,在微博场景中,限制140字符,已无法发布出去。在短信场景中,限制70字符,会产生5条短信费用,被拆分后还无法访问,严重影响用户体验。http://wjorder-http.jd.com/scan/np?encodePrcode=2hP_lwNr&encodeShcode=2-S83&businessSource=1&scanSkuType=2&ec=1&salerId=167916&discountsUrl=%2F%2Fcoupon.m.jd.com%2Fcoupons%2Fshow.action%3FlinkKey%3DAAROH_xIpeffAs_-naABEFoePLd7eC4GJgwsPUkFtDqklu805DO1cEqFyTHVT7fbD12AHD7DElAKgh0pfvQpX-E5PbgwLQ&unionId=1001465750

2、长网址生成的二维码,极其复杂 ,导致手机扫描识别极其困难,低端手机甚至无法识别,严重影响用户体验。

短网址则完美解决了上述问题:

1、使用短网址服务缩短上面长网址后的短网址(3.cn/1jK-CDAE),仅有13个字符,在微博、短信等场景中发送十分容易,而且简洁清晰,用户体验极好。

2、短网址生成的二维码,极其简洁 ,非常容易识别,用户体验良好。

京东短网址的业务场景:

京东短网址http://s.3.cn/,是京东唯一的短网址服务平台,已应用到京东体系的各个业务场景中,日均产生1亿条带有3.cn的短消息,点击短网址还可直接唤起对应的APP和小程序。

如下图1-2是来自七鲜、金龙鱼、京东金融、蒙牛、京东等业务的营销消息,下图3-4是唤起七鲜小程序、京东APP、金融APP并跳转至落地页的截图。

图1

图2

图3

图4

京东短网址服务的架构优化:

改造前短网址生成流程图说明:

1、系统首先查询长网址(长链)是否已存在于redis(jimdb)或hbase中,

2、如果长链已存在,则表示该长网址已经生成过,可直接返回查到的短网址,流程结束。

3、如果长链不存在,则使用长网址进行MD5随机算法生成一个长串,并分成3段,转化成62进制短码,拼装成短网址,然后查询短网址(短链)是否存在于redis或hbase中

4、如果短链不存在,则保存长网址到短网址的映射、以及短网址到长网址的映射,到redis或hbase中,返回短网址,流程结束。

5、如果短链已存在,说明随机算法生成的短码发生了冲突碰撞,需要循环回到步骤3,加盐重新生成一个短码,直到生成的短码检测没有冲突后,走到步骤4结束。

从原流程图分析原系统优劣势:

优势:采用随机算法,同一长链在同一账号下始终唯一,适用于长网址大量重复生成的情景,可以在步骤2快速返回,且随机算法遍历难度相对较高。

劣势:外部操作太多,性能影响较大,每次生成短网址涉及的网络请求次数至少8次(2次查redis、2次写redis、2次查hbase、2次写hbase)。

且从上面步骤5可以看出,系统存在一个碰撞循环,随着短码数据量日益增加,碰撞率也会大大增加,每次碰撞都要额外增加1次redis与1次hbase查询,导致性能越来越差。

分析原流程&历史数据,寻找原流程优化点:

1、 从原流程可以看出,如果继续采用随机算法,很难进行优化,因此,想到了可以采用自增算法,因为自增不存在碰撞,就不需要进行双向检索存储,能够极大的降低外部请求数。

2、 分析历史数据发现,很少存在长网址被大量重复生成的情况,也就是说,可以采用自增算法的单向存储(仅存储短网址到长网址的映射),并不会增加存储量,反而会比随机算法的双向存储(存储短到长的映射,及长到短的映射,即双倍存储)节省存储量。

3、 分析历史数据发现,90%超过1个月的短网址都不再有访问量了,同时调研业务也发现,43%用户1个月有效期就够了,46%用户3个月,10%用户1年,极少有用户需要短网址永久有效。

4、 分析历史数据发现,生成的数据量很大,日均1亿+,且大多数短网址并不需要永久保存,需要做好清理规划

5、 分析历史数据发现,生成量远大于跳转量,跳转服务流程简单仅做查询,优化空间不大,倒是对生成服务性能要求极高,优化重点在于生成服务。

优化后的短码生成流程说明:

1、 系统直接采用自增算法生成了一个短码,因为自增算法没有了随机碰撞,也就不需要再检索短网址是否存在redis或hbase中。

2、 直接保存短网址到长网址的映射到redis中,因为没有了检索长网址是否存在于redis或hbase,也就不再需要保存长网址到短网址的映射,也就可以把hbase的写入改成异步写入,然后直接返回短网址,流程结束。(可以看到系统仅剩下1次同步的redis操作,流程极大简化,可以预见接口性能将得到极大提升)

自研专利算法介绍

细心的同学可能会有疑问,上面的分布式自增算法是怎么实现的呢?

目前市面上已知方案,1、通过数据库自增(并发QPS数有限)2、通过redis自增(存在单key热点问题,也就是所有的发号请求都会打到同一分片上),两种方案均会增加性能损耗,且存在扩展瓶颈,无法满足京东的海量业务请求。3、雪花算法(长度太长不符合,短网址要求长度一般在7个字符)

因此设计了下面的专利自增算法:(性能近乎于内存,损耗可忽略)

下面介绍一下核心的自增算法原理:主要采用缓存发号加内存自增方式,既无碰撞率又性能极高,主要体现在下图的三条彩色通道上面。

1、绿色通道:内存发号,速度极快,每次从缓存取出10000个无重复号码,然后在内存中便可连续生成10000个短码,因此速度比传统基于数据库及缓存自增发号方式快万倍。

2、蓝色通道:缓存取号,依赖缓存保证分布式发号无碰撞,批量发号,每1万次内存绿色通道才走一次蓝色缓存通道取号,因此性能极高

3、红色通道:保障机制,保障生成的号码都在短网址对应长度的号码总容量范围内,仅在初始化及总容量用尽时执行,性能损耗可忽略不计。

长度&有效期规划:

• 有访问会自动延期N天(7位短码总容量3万亿,过期时间30天,每天有1000亿短码可用,30天内有1次访问就会重置30天有效期,也就是说保持“热数据”始终在redis中)

• 连续N天无访问自动回收(7位短码,连续30天没有访问的情况下,才会过期回收,也就是说“冷数据”无访问N天后会自动过期清理回收)

以下统计了最近6天的各短码长度的使用分布占比情况,目前使用最多的是7位与8位短码,占比总和近90%。其中43%的用户选择了30天有效期,46%的用户选择来了100天有效期。

提效成果:

Ø 接口性能极大提升:tp999:从150+ms ->7ms,解决了业务调用缓慢及超时的痛点

Ø 单机承载量极大提升:单机QPS:从497->10184,提升了20倍+,无扩容支撑了日生成量:从1千万->2亿+

Ø 按百度短网址费用核算,1年可节约2700万元(证明短网址产生价值很大

Ø redis缓存30天热数据,缓存量 1.2TB

Ø Hbase存储全量数据,存储量 4TB

Ø 6月18日生成量4.7亿、6月日均1亿、峰值QPS 7.2万

Ø 6月1日跳转量1600万、6月日均800万

Ø 线上仅8台4核docker(优化后日常节约了760核机器,618节约3572核)

Ø 有访问自动延期,无访问自动过期回收,避免了死码长期占用资源消耗费用,避免短码越积越多导致的数据量太大及性能下降,系统可长期稳定运行

创新性:

Ø 产出技术发明 专利1篇,编号:JDZL2019N5022

Ø 技术关键点是分布式 无碰撞 高效 短码生成算法:

Ø 该算法利用redis的incrby实现分布式号段发放(5位短码每次发放1000个号,当然6、7位短码可设置更大步长值10000个),利用本机原子id自增减少redis请求(每10000个id自增后请求1次redis),因为id始终自增所以短码无碰撞概率(id可以直接转化为62进制短码),避免了因短码碰撞带来的循环生成检索的性能开销。利用redis.set原子检测key不存在时才能设置成功实现分布式加锁,解决多线程并发重置问题,最终实现比传统自增方案快万倍的高性能无碰撞短码自增算法。

Ø 利用容量规划及过期时间机制(5位短码总容量9亿,有效期10天,每天有9千万可用),实现号段循环重复利用(10天后第1天的号段过期,可以再次使用)(当然如果是6位短码、总容量有550亿,有效期也可以更长。7位短码总容量3万亿,基本可以不用过期了),保障了系统的长期稳定运行。

影响力:

Ø 宙斯平台-京麦服务市场中上架,有**470+**京东商户应用使用。3.cn/1-jMkHBf

Ø 3.cn作为京东唯一的短网址服务平台,合作的应用50+(京东APP、京东金融、京东云、京东保险、七鲜、京东健康、京东物流等等)、小程序20+、合作的二级部门80+

与京东短网址高可用提升最佳实践相似的内容:

京东短网址高可用提升最佳实践

短网址,是在长度上比较短的网址。简单来说就是帮您把冗长的URL地址缩短成8个字符以内的短网址。

跨机房ES同步实战

作者:谢泽华 背景 众所周知单个机房在出现不可抗拒的问题(如断电、断网等因素)时,会导致无法正常提供服务,会对业务造成潜在的损失。所以在协同办公领域,一种可以基于同城或异地多活机制的高可用设计,在保障数据一致性的同时,能够最大程度降低由于机房的仅单点可用所导致的潜在高可用问题,最大程度上保障业务的用

基于Spring Cache实现Caffeine、jimDB多级缓存实战

在早期参与涅槃氛围标签中台项目中,前台要求接口性能999要求50ms以下,通过设计Caffeine、ehcache堆外缓存、jimDB三级缓存,利用内存、堆外、jimDB缓存不同的特性提升接口性能, 内存缓存采用Caffeine缓存,利用W-TinyLFU算法获得更高的内存命中率;同时利用堆外缓存降低内存缓存大小,减少GC频率,同时也减少了网络IO带来的性能消耗;利用JimDB提升接口高可用、高并

互联网高可用架构探讨

在互联网架构设计中,高可用是必不可少的环节,要从网络架构、服务架构、数据架构以及软硬件架构等多方面来分析设计,是架构师必备的技能之一。

玩转服务器之网站篇:新手使用WordPress搭建博客和静态网站部署

在之前的玩转服务器系列文章里,我们介绍了如何构建小型的高可用环境、PHP、Python、Java web、docker环境部署,以及Node.js SSR应用,本篇文章主要介绍新手也能快速上手的WordPress博客搭建和静态网站部署的教程

一文详解 Netty 组件

Netty 是一款优秀的高性能网络框架,内部通过 NIO 的方式来处理网络请求,在高负载下也能可靠和高效地处理 I/O 操作。下面这篇文章将主要对 Netty 中的各个组件进行分析,并在介绍完了各个组件之后,通过 JSF 这个 RPC 框架为例来分析 Netty 的使用。

国际财务系统基于ShardingSphere的数据分片和一主多从实践

作者:京东物流 张广治 1 背景 传统的将数据集中存储至单一数据节点的解决方案,在性能和可用性方面已经难于满足海量数据的场景,系统最大的瓶颈在于单个节点读写性能,许多的资源受到单机的限制,例如连接数、网络IO、磁盘IO等,从而导致它的并发能力不高,对于高并发的要求不满足。 每到月初国际财务系统压力巨

直播CDN调度技术关键挑战与架构设计

作者:胡济麟 1、背景介绍 1.1 直播业务特点 互联网视频直播是一种消息媒介形态,提供时产时消的内容,经过多年,已经发展出秀场、游戏、电商、体育等多种业务形态。主要特点是:内容实时产生实时消费,对时效性要求更高;流媒体内容占用带宽大,对网络质量要求更苛刻;一人生产、多人消费,带宽规模大。直播 CD

云计算时代前端如何保证开源代码的安全性

云技术和我们的生活息息相关,日常生活中访问的网页,刷的短视频,用的云盘等都是云计算提供的服务。那在云计算时代,前端可以做什么呢?

聊聊wireshark的进阶使用功能

emmm,说起网络知识学习肯定离不来wireshark工具,这个工具能够帮助我们快速地定位网络问题以及帮助正在学习网络协议这块的知识的同学验证理论与实际的一大利器,平时更多的只是停留在初步的使用阶段。也是利用部门内部的网络兴趣小组的讨论机会,私下对wireshark的一些进阶功能,比如专家模式、图表等功能进行调研,并结合实际场景抓包分析对功能进行对照说明。