什么是短網(wǎng)址?
短網(wǎng)址,是在長(zhǎng)度上比較短的網(wǎng)址。簡(jiǎn)單來(lái)說(shuō)就是幫您把冗長(zhǎng)的URL地址縮短成8個(gè)字符以內(nèi)的短網(wǎng)址。
當(dāng)我們?cè)隍v訊、新浪發(fā)微博時(shí),有時(shí)發(fā)很長(zhǎng)的網(wǎng)址連接,但由于微博只限制140個(gè)字,所以微博就自動(dòng)把您發(fā)的長(zhǎng)網(wǎng)址給轉(zhuǎn)換成短網(wǎng)址了。在微博和手機(jī)短信提醒等限制字?jǐn)?shù)的地方來(lái)使用短網(wǎng)址,的確是一個(gè)不錯(cuò)的方案。
短網(wǎng)址通常使用“短域名/短碼”的形式,打開(kāi)短網(wǎng)址網(wǎng)頁(yè)會(huì)直接跳轉(zhuǎn)到長(zhǎng)網(wǎng)址頁(yè)面。例:3.cn/CdEyF2、t.cn/RlB2PdD、dwz.cn/134128 等短網(wǎng)址,分別是由以下短網(wǎng)址服務(wù)縮短后的網(wǎng)址 京東短網(wǎng)址:http://s.3.cn/, 新浪短網(wǎng)址:https://sina.lt/ ,百度短網(wǎng)址:http://dwz.cn/。
短網(wǎng)址服務(wù)主要包含功能: 生成短網(wǎng)址(長(zhǎng)網(wǎng)址縮短)、二維碼簡(jiǎn)化、修改短網(wǎng)址、短網(wǎng)址跳轉(zhuǎn)(訪問(wèn)短網(wǎng)址跳轉(zhuǎn)到長(zhǎng)網(wǎng)址)、喚醒APP、短網(wǎng)址統(tǒng)計(jì) 等。
?
短網(wǎng)址能解決什么問(wèn)題?
長(zhǎng)網(wǎng)址存在的問(wèn)題:
1、長(zhǎng)網(wǎng)址的長(zhǎng)度太長(zhǎng),下面的長(zhǎng)網(wǎng)址,共記312個(gè)字符,在微博場(chǎng)景中,限制140字符,已無(wú)法發(fā)布出去。在短信場(chǎng)景中,限制70字符,會(huì)產(chǎn)生5條短信費(fèi)用,被拆分后還無(wú)法訪問(wèn),嚴(yán)重影響用戶體驗(yàn)。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、長(zhǎng)網(wǎng)址生成的二維碼,極其復(fù)雜 ,導(dǎo)致手機(jī)掃描識(shí)別極其困難,低端手機(jī)甚至無(wú)法識(shí)別,嚴(yán)重影響用戶體驗(yàn)。
短網(wǎng)址則完美解決了上述問(wèn)題:
1、使用短網(wǎng)址服務(wù)縮短上面長(zhǎng)網(wǎng)址后的短網(wǎng)址(3.cn/1jK-CDAE),僅有13個(gè)字符,在微博、短信等場(chǎng)景中發(fā)送十分容易,而且簡(jiǎn)潔清晰,用戶體驗(yàn)極好。
2、短網(wǎng)址生成的二維碼,極其簡(jiǎn)潔 ,非常容易識(shí)別,用戶體驗(yàn)良好。
?
京東短網(wǎng)址的業(yè)務(wù)場(chǎng)景:
京東短網(wǎng)址http://s.3.cn/,是京東唯一的短網(wǎng)址服務(wù)平臺(tái),已應(yīng)用到京東體系的各個(gè)業(yè)務(wù)場(chǎng)景中,日均產(chǎn)生1億條帶有3.cn的短消息,點(diǎn)擊短網(wǎng)址還可直接喚起對(duì)應(yīng)的APP和小程序。
如下圖1-2是來(lái)自七鮮、金龍魚(yú)、京東金融、蒙牛、京東等業(yè)務(wù)的營(yíng)銷消息,下圖3-4是喚起七鮮小程序、京東APP、金融APP并跳轉(zhuǎn)至落地頁(yè)的截圖。
圖1
圖2
圖3
圖4
京東短網(wǎng)址服務(wù)的架構(gòu)優(yōu)化:
改造前短網(wǎng)址生成流程圖說(shuō)明:
1、系統(tǒng)首先查詢長(zhǎng)網(wǎng)址(長(zhǎng)鏈)是否已存在于redis(jimdb)或hbase中,
2、如果長(zhǎng)鏈已存在,則表示該長(zhǎng)網(wǎng)址已經(jīng)生成過(guò),可直接返回查到的短網(wǎng)址,流程結(jié)束。
3、如果長(zhǎng)鏈不存在,則使用長(zhǎng)網(wǎng)址進(jìn)行MD5隨機(jī)算法生成一個(gè)長(zhǎng)串,并分成3段,轉(zhuǎn)化成62進(jìn)制短碼,拼裝成短網(wǎng)址,然后查詢短網(wǎng)址(短鏈)是否存在于redis或hbase中
4、如果短鏈不存在,則保存長(zhǎng)網(wǎng)址到短網(wǎng)址的映射、以及短網(wǎng)址到長(zhǎng)網(wǎng)址的映射,到redis或hbase中,返回短網(wǎng)址,流程結(jié)束。
5、如果短鏈已存在,說(shuō)明隨機(jī)算法生成的短碼發(fā)生了沖突碰撞,需要循環(huán)回到步驟3,加鹽重新生成一個(gè)短碼,直到生成的短碼檢測(cè)沒(méi)有沖突后,走到步驟4結(jié)束。
從原流程圖分析原系統(tǒng)優(yōu)劣勢(shì):
優(yōu)勢(shì):采用隨機(jī)算法,同一長(zhǎng)鏈在同一賬號(hào)下始終唯一,適用于長(zhǎng)網(wǎng)址大量重復(fù)生成的情景,可以在步驟2快速返回,且隨機(jī)算法遍歷難度相對(duì)較高。
劣勢(shì):外部操作太多,性能影響較大,每次生成短網(wǎng)址涉及的網(wǎng)絡(luò)請(qǐng)求次數(shù)至少8次(2次查redis、2次寫(xiě)redis、2次查hbase、2次寫(xiě)hbase)。
且從上面步驟5可以看出,系統(tǒng)存在一個(gè)碰撞循環(huán),隨著短碼數(shù)據(jù)量日益增加,碰撞率也會(huì)大大增加,每次碰撞都要額外增加1次redis與1次hbase查詢,導(dǎo)致性能越來(lái)越差。
?
分析原流程&歷史數(shù)據(jù),尋找原流程優(yōu)化點(diǎn):
1、 從原流程可以看出,如果繼續(xù)采用隨機(jī)算法,很難進(jìn)行優(yōu)化,因此,想到了可以采用自增算法,因?yàn)樽栽霾淮嬖谂鲎玻筒恍枰M(jìn)行雙向檢索存儲(chǔ),能夠極大的降低外部請(qǐng)求數(shù)。
2、 分析歷史數(shù)據(jù)發(fā)現(xiàn),很少存在長(zhǎng)網(wǎng)址被大量重復(fù)生成的情況,也就是說(shuō),可以采用自增算法的單向存儲(chǔ)(僅存儲(chǔ)短網(wǎng)址到長(zhǎng)網(wǎng)址的映射),并不會(huì)增加存儲(chǔ)量,反而會(huì)比隨機(jī)算法的雙向存儲(chǔ)(存儲(chǔ)短到長(zhǎng)的映射,及長(zhǎng)到短的映射,即雙倍存儲(chǔ))節(jié)省存儲(chǔ)量。
3、 分析歷史數(shù)據(jù)發(fā)現(xiàn),90%超過(guò)1個(gè)月的短網(wǎng)址都不再有訪問(wèn)量了,同時(shí)調(diào)研業(yè)務(wù)也發(fā)現(xiàn),43%用戶1個(gè)月有效期就夠了,46%用戶3個(gè)月,10%用戶1年,極少有用戶需要短網(wǎng)址永久有效。
4、 分析歷史數(shù)據(jù)發(fā)現(xiàn),生成的數(shù)據(jù)量很大,日均1億+,且大多數(shù)短網(wǎng)址并不需要永久保存,需要做好清理規(guī)劃
5、 分析歷史數(shù)據(jù)發(fā)現(xiàn),生成量遠(yuǎn)大于跳轉(zhuǎn)量,跳轉(zhuǎn)服務(wù)流程簡(jiǎn)單僅做查詢,優(yōu)化空間不大,倒是對(duì)生成服務(wù)性能要求極高,優(yōu)化重點(diǎn)在于生成服務(wù)。
?
優(yōu)化后的短碼生成流程說(shuō)明:
1、 系統(tǒng)直接采用自增算法生成了一個(gè)短碼,因?yàn)樽栽鏊惴](méi)有了隨機(jī)碰撞,也就不需要再檢索短網(wǎng)址是否存在redis或hbase中。
2、 直接保存短網(wǎng)址到長(zhǎng)網(wǎng)址的映射到redis中,因?yàn)闆](méi)有了檢索長(zhǎng)網(wǎng)址是否存在于redis或hbase,也就不再需要保存長(zhǎng)網(wǎng)址到短網(wǎng)址的映射,也就可以把hbase的寫(xiě)入改成異步寫(xiě)入,然后直接返回短網(wǎng)址,流程結(jié)束。(可以看到系統(tǒng)僅剩下1次同步的redis操作,流程極大簡(jiǎn)化,可以預(yù)見(jiàn)接口性能將得到極大提升)
自研專利算法介紹
細(xì)心的同學(xué)可能會(huì)有疑問(wèn),上面的分布式自增算法是怎么實(shí)現(xiàn)的呢?
目前市面上已知方案,1、通過(guò)數(shù)據(jù)庫(kù)自增(并發(fā)QPS數(shù)有限)2、通過(guò)redis自增(存在單key熱點(diǎn)問(wèn)題,也就是所有的發(fā)號(hào)請(qǐng)求都會(huì)打到同一分片上),兩種方案均會(huì)增加性能損耗,且存在擴(kuò)展瓶頸,無(wú)法滿足京東的海量業(yè)務(wù)請(qǐng)求。3、雪花算法(長(zhǎng)度太長(zhǎng)不符合,短網(wǎng)址要求長(zhǎng)度一般在7個(gè)字符)
因此設(shè)計(jì)了下面的專利自增算法:(性能近乎于內(nèi)存,損耗可忽略)
下面介紹一下核心的自增算法原理:主要采用緩存發(fā)號(hào)加內(nèi)存自增方式,既無(wú)碰撞率又性能極高,主要體現(xiàn)在下圖的三條彩色通道上面。
1、綠色通道:內(nèi)存發(fā)號(hào),速度極快,每次從緩存取出10000個(gè)無(wú)重復(fù)號(hào)碼,然后在內(nèi)存中便可連續(xù)生成10000個(gè)短碼,因此速度比傳統(tǒng)基于數(shù)據(jù)庫(kù)及緩存自增發(fā)號(hào)方式快萬(wàn)倍。
2、藍(lán)色通道:緩存取號(hào),依賴緩存保證分布式發(fā)號(hào)無(wú)碰撞,批量發(fā)號(hào),每1萬(wàn)次內(nèi)存綠色通道才走一次藍(lán)色緩存通道取號(hào),因此性能極高
3、紅色通道:保障機(jī)制,保障生成的號(hào)碼都在短網(wǎng)址對(duì)應(yīng)長(zhǎng)度的號(hào)碼總?cè)萘糠秶鷥?nèi),僅在初始化及總?cè)萘坑帽M時(shí)執(zhí)行,性能損耗可忽略不計(jì)。
長(zhǎng)度&有效期規(guī)劃:
? 有訪問(wèn)會(huì)自動(dòng)延期N天(7位短碼總?cè)萘?萬(wàn)億,過(guò)期時(shí)間30天,每天有1000億短碼可用,30天內(nèi)有1次訪問(wèn)就會(huì)重置30天有效期,也就是說(shuō)保持“熱數(shù)據(jù)”始終在redis中)
? 連續(xù)N天無(wú)訪問(wèn)自動(dòng)回收(7位短碼,連續(xù)30天沒(méi)有訪問(wèn)的情況下,才會(huì)過(guò)期回收,也就是說(shuō)“冷數(shù)據(jù)”無(wú)訪問(wèn)N天后會(huì)自動(dòng)過(guò)期清理回收)
以下統(tǒng)計(jì)了最近6天的各短碼長(zhǎng)度的使用分布占比情況,目前使用最多的是7位與8位短碼,占比總和近90%。其中43%的用戶選擇了30天有效期,46%的用戶選擇來(lái)了100天有效期。
?
提效成果:
? 接口性能極大提升:tp999:從150+ms ->7ms,解決了業(yè)務(wù)調(diào)用緩慢及超時(shí)的痛點(diǎn)
? 單機(jī)承載量極大提升:?jiǎn)螜C(jī)QPS:從497->10184,提升了20倍+,無(wú)擴(kuò)容支撐了日生成量:從1千萬(wàn)->2億+
? 按百度短網(wǎng)址費(fèi)用核算,1年可節(jié)約2700萬(wàn)元(證明短網(wǎng)址產(chǎn)生價(jià)值很大
? redis緩存30天熱數(shù)據(jù),緩存量 1.2TB
? Hbase存儲(chǔ)全量數(shù)據(jù),存儲(chǔ)量 4TB
? 6月18日生成量4.7億、6月日均1億、峰值QPS 7.2萬(wàn)
? 6月1日跳轉(zhuǎn)量1600萬(wàn)、6月日均800萬(wàn)
? 線上僅8臺(tái)4核docker(優(yōu)化后日常節(jié)約了760核機(jī)器,618節(jié)約3572核)
? 有訪問(wèn)自動(dòng)延期,無(wú)訪問(wèn)自動(dòng)過(guò)期回收,避免了死碼長(zhǎng)期占用資源消耗費(fèi)用,避免短碼越積越多導(dǎo)致的數(shù)據(jù)量太大及性能下降,系統(tǒng)可長(zhǎng)期穩(wěn)定運(yùn)行
創(chuàng)新性:
? 產(chǎn)出技術(shù)發(fā)明 專利1篇,編號(hào):JDZL2019N5022
? 技術(shù)關(guān)鍵點(diǎn)是分布式 無(wú)碰撞 高效 短碼生成算法:
? 該算法利用redis的incrby實(shí)現(xiàn)分布式號(hào)段發(fā)放(5位短碼每次發(fā)放1000個(gè)號(hào),當(dāng)然6、7位短碼可設(shè)置更大步長(zhǎng)值10000個(gè)),利用本機(jī)原子id自增減少redis請(qǐng)求(每10000個(gè)id自增后請(qǐng)求1次redis),因?yàn)閕d始終自增所以短碼無(wú)碰撞概率(id可以直接轉(zhuǎn)化為62進(jìn)制短碼),避免了因短碼碰撞帶來(lái)的循環(huán)生成檢索的性能開(kāi)銷。利用redis.set原子檢測(cè)key不存在時(shí)才能設(shè)置成功實(shí)現(xiàn)分布式加鎖,解決多線程并發(fā)重置問(wèn)題,最終實(shí)現(xiàn)比傳統(tǒng)自增方案快萬(wàn)倍的高性能無(wú)碰撞短碼自增算法。
? 利用容量規(guī)劃及過(guò)期時(shí)間機(jī)制(5位短碼總?cè)萘?億,有效期10天,每天有9千萬(wàn)可用),實(shí)現(xiàn)號(hào)段循環(huán)重復(fù)利用(10天后第1天的號(hào)段過(guò)期,可以再次使用)(當(dāng)然如果是6位短碼、總?cè)萘坑?50億,有效期也可以更長(zhǎng)。7位短碼總?cè)萘?萬(wàn)億,基本可以不用過(guò)期了),保障了系統(tǒng)的長(zhǎng)期穩(wěn)定運(yùn)行。
?
影響力:
? 培訓(xùn)分享 《3.cn最佳實(shí)踐》,ppt地址
? 宙斯平臺(tái)-京麥服務(wù)市場(chǎng)中上架,有470+京東商戶應(yīng)用使用。3.cn/1-jMkHBf?
? 3.cn作為京東唯一的短網(wǎng)址服務(wù)平臺(tái),合作的應(yīng)用50+(京東APP、京東金融、京東云、京東保險(xiǎn)、七鮮、京東健康、京東物流等等)、小程序20+、合作的二級(jí)部門(mén)80+
京東短網(wǎng)址官網(wǎng)簡(jiǎn)介:
打開(kāi)瀏覽器輸入短網(wǎng)址s.3.cn,進(jìn)入網(wǎng)站,使用erp登陸。
在輸入框輸入長(zhǎng)網(wǎng)址,點(diǎn)擊“生成”按鈕,即可生成短網(wǎng)址及二維碼,如下圖1。
點(diǎn)擊“分析數(shù)據(jù)”可以查看該短網(wǎng)址被用戶打開(kāi)次數(shù)的統(tǒng)計(jì)趨勢(shì)圖、訪問(wèn)的IP數(shù)趨勢(shì)圖、網(wǎng)絡(luò)運(yùn)營(yíng)商占比、訪問(wèn)地區(qū)占比等統(tǒng)計(jì),如下圖2。
圖1
圖2
?
審核編輯 黃宇
-
算法
+關(guān)注
關(guān)注
23文章
4629瀏覽量
93234 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3845瀏覽量
64618 -
京東
+關(guān)注
關(guān)注
2文章
1000瀏覽量
48671
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論