轉(zhuǎn)轉(zhuǎn)是中國(guó)領(lǐng)先的二手交易平臺(tái),鏈接作為用戶(hù)在平臺(tái)上進(jìn)行交互和信息傳遞的重要媒介,扮演著不可或缺的角色。
圖片
傳統(tǒng)長(zhǎng)鏈接通常包含大量字符和特殊符號(hào),不易記憶和傳播。由于字?jǐn)?shù)的原因,長(zhǎng)鏈接在發(fā)送短信,生成二維碼和社交平臺(tái)發(fā)布等場(chǎng)合下會(huì)也有一定的局限性。
圖片
短鏈平臺(tái)接收到業(yè)務(wù)方提供的長(zhǎng)鏈接后,先通過(guò)哈希算法(MD5)檢查是否已存在短鏈接映射關(guān)系,存在即返回,不存在則生成唯一 ID 標(biāo)識(shí)(號(hào)段模式),再選擇適當(dāng)?shù)亩替溄由伤惴ǎ˙ase62),將該唯一 ID 轉(zhuǎn)換為短鏈接。生成的短鏈接與原始長(zhǎng)鏈接之間的映射關(guān)系需要被持久化,以便在用戶(hù)訪(fǎng)問(wèn)時(shí)能夠快速地查找并定位到原始長(zhǎng)鏈接。
一旦短鏈接生成成功,短鏈平臺(tái)將返回這個(gè)短鏈接給業(yè)務(wù)方。業(yè)務(wù)方可以通過(guò)多種方式將短鏈接傳播給用戶(hù),如將其嵌入到網(wǎng)頁(yè)中、發(fā)送短信、分享到社交媒體等。用戶(hù)獲得這個(gè)短鏈接后,就可以點(diǎn)擊訪(fǎng)問(wèn)相應(yīng)的資源。
當(dāng)用戶(hù)點(diǎn)擊短鏈接時(shí),瀏覽器向短鏈平臺(tái)發(fā)送請(qǐng)求。短鏈平臺(tái)需要根據(jù)短鏈接查找映射關(guān)系,然后將用戶(hù)正確引導(dǎo)到原始長(zhǎng)鏈接的業(yè)務(wù)系統(tǒng)。這一步驟需要高效的數(shù)據(jù)檢索和跳轉(zhuǎn)機(jī)制。
HTTP 狀態(tài)碼 301 和 302 都能代表重定向,301 永久重定向會(huì)使用瀏覽器緩存導(dǎo)致統(tǒng)計(jì)短鏈訪(fǎng)問(wèn)次數(shù)不正確,302 臨時(shí)重定向會(huì)每次都訪(fǎng)問(wèn)到短鏈平臺(tái)從而增加服務(wù)壓力。
長(zhǎng)鏈接到短鏈接的轉(zhuǎn)換是短鏈平臺(tái)的核心功能,這需要一個(gè)高效且唯一的算法來(lái)確保每個(gè)長(zhǎng)鏈接都可以映射到一個(gè)對(duì)應(yīng)的短鏈接。
MD5 是一種廣泛應(yīng)用的哈希算法,將輸入數(shù)據(jù)轉(zhuǎn)換為 128 位的哈希值,在短鏈平臺(tái)中可以用于生成短鏈接的基礎(chǔ)哈希值。
SHA-256 是一種更安全的哈希算法,它生成256位的哈希值。雖然相對(duì)于MD5,SHA-256更安全,但同時(shí)也會(huì)更長(zhǎng),影響了短鏈接的長(zhǎng)度。
直接使用哈希結(jié)果作為短鏈接時(shí),哈希碰撞和鏈接長(zhǎng)度都是需要考慮的問(wèn)題。在短鏈平臺(tái)中,需要采取措施來(lái)防止哈希碰撞,例如使用唯一性標(biāo)識(shí)符。
自增 ID 是另一種常見(jiàn)的分布式唯一 ID 生成方式,通過(guò)一個(gè)自增的計(jì)數(shù)器來(lái)生成唯一 ID。例如 MySQL 的自增主鍵,或者 Redis 的 incr 指令。這種方法簡(jiǎn)單且高效,適用于許多場(chǎng)景。
號(hào)段模式會(huì)為不同的節(jié)點(diǎn)分配不同的號(hào)段范圍,每個(gè)節(jié)點(diǎn)內(nèi)部自增生成唯一的 ID,用完后再重新分配,從而確保全局唯一性。
圖片
SnowFlake(雪花算法)是一種常用的分布式唯一 ID 生成算法,它將一個(gè)大整數(shù) ID 拆分成多個(gè)部分,包括時(shí)間戳、機(jī)器 ID、數(shù)據(jù)中心 ID 和序列號(hào)等,從而保證了生成的 ID 是唯一且遞增的。
圖片
然而,盡管雪花算法在分布式環(huán)境中生成唯一 ID 方面表現(xiàn)出色,但它并不免疫于時(shí)鐘回?fù)軉?wèn)題。如果發(fā)生時(shí)鐘回?fù)埽赡軙?huì)導(dǎo)致生成的 ID 在時(shí)間上產(chǎn)生逆序。
Base62 編碼是將數(shù)據(jù)轉(zhuǎn)換為只包含數(shù)字和字母的一種方法。它使用了 62 個(gè)字符,分別是 0-9、a-z、A-Z,可以作為 URL 短鏈接、文件名等場(chǎng)景的字符串表示,相對(duì)于16進(jìn)制或64進(jìn)制等其他編碼,Base62 具有更高的可讀性和穩(wěn)定性。
import java.util.ArrayList;import java.util.List;public class Base62Encoder { private static final String BASE62_CHARACTERS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; public static String encode(long num) { StringBuilder sb = new StringBuilder(); do { int remainder = (int) (num % 62); sb.insert(0, BASE62_CHARACTERS.charAt(remainder)); num /= 62; } while (num != 0); return sb.toString(); }}僅 6 位的 Base62 編碼,能表示約 568 億(62 的 6 次方)的數(shù)。
在轉(zhuǎn)轉(zhuǎn)短鏈平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程中,確保用戶(hù)數(shù)據(jù)的安全性和平臺(tái)的穩(wěn)定性是首要任務(wù)。為此,我們采用了一系列安全與防護(hù)策略,以應(yīng)對(duì)潛在的風(fēng)險(xiǎn)和威脅,保障用戶(hù)隱私和系統(tǒng)的正常運(yùn)行。
在生成短鏈接之前,首先需要對(duì)用戶(hù)提供的原始長(zhǎng)鏈接進(jìn)行驗(yàn)證,以確保鏈接指向的是合法且可信任的目標(biāo)資源。
合法性校驗(yàn)通常涵蓋以下幾個(gè)方面:
重復(fù)生成短鏈接的防護(hù)策略在短鏈平臺(tái)的設(shè)計(jì)中具有重要意義。它旨在防止因重復(fù)生成相同的短鏈接而造成的資源浪費(fèi)和系統(tǒng)混亂。
短鏈平臺(tái)可以基于長(zhǎng)鏈接的 MD5 值采用冪等性設(shè)計(jì),確保多次相同請(qǐng)求的處理結(jié)果是一致的,不會(huì)產(chǎn)生額外的短鏈接。
在用戶(hù)點(diǎn)擊或輸入短鏈接后,短鏈平臺(tái)需要快速準(zhǔn)確地判斷該鏈接是否有效,從而決定是否將用戶(hù)重定向到原始長(zhǎng)鏈接或提供相應(yīng)的錯(cuò)誤信息。
短鏈平臺(tái)會(huì)通過(guò)查詢(xún)數(shù)據(jù)庫(kù)來(lái)驗(yàn)證短鏈接的有效性。如果短鏈接與有效的映射關(guān)系存在,平臺(tái)將確認(rèn)鏈接有效,否則將判定鏈接無(wú)效。
系統(tǒng)性能的優(yōu)化是確保轉(zhuǎn)轉(zhuǎn)短鏈平臺(tái)高效、穩(wěn)定運(yùn)行的關(guān)鍵。通過(guò)采用一系列策略和技術(shù),我們不斷提升平臺(tái)的響應(yīng)速度、并發(fā)處理能力和資源利用效率,以滿(mǎn)足用戶(hù)的需求并提供卓越的用戶(hù)體驗(yàn)。
數(shù)據(jù)庫(kù)是短鏈平臺(tái)的核心數(shù)據(jù)存儲(chǔ)組件,因此優(yōu)化數(shù)據(jù)庫(kù)的設(shè)計(jì)和訪(fǎng)問(wèn)非常重要。將長(zhǎng)鏈接的唯一標(biāo)識(shí) ID 作為主鍵索引,長(zhǎng)鏈接的 MD5 值作為普通索引,以支持快速的鏈接有效性驗(yàn)證和重定向操作。
利用緩存技術(shù)可以顯著減少數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)次數(shù),從而提高系統(tǒng)的響應(yīng)速度。我們采用了分布式緩存 Redis,將短鏈接映射關(guān)系異步存儲(chǔ)在緩存中,減輕數(shù)據(jù)庫(kù)的壓力。這樣可以在高并發(fā)情況下,快速地獲取鏈接映射信息,提升用戶(hù)訪(fǎng)問(wèn)的效率。
傳統(tǒng)號(hào)段模式在節(jié)點(diǎn)消耗完所有號(hào)段時(shí)才會(huì)向發(fā)號(hào)器請(qǐng)求分配新的號(hào)段,這可能會(huì)引起短時(shí)間內(nèi)的性能瓶頸。我們引入獨(dú)立的監(jiān)控線(xiàn)程定期檢查號(hào)段的使用情況,一旦使用 ID 數(shù)量超過(guò)閾值時(shí)就請(qǐng)求分配新的號(hào)段。新的號(hào)段模式能夠在高并發(fā)情況下平穩(wěn)地切換號(hào)段,通過(guò)預(yù)先分配號(hào)段以避免阻塞業(yè)務(wù)流程,從而提高系統(tǒng)的性能和穩(wěn)定性。
圖片
隨著用戶(hù)數(shù)量和鏈接數(shù)據(jù)的增長(zhǎng),單一數(shù)據(jù)庫(kù)表可能會(huì)面臨性能瓶頸。為了應(yīng)對(duì)這個(gè)問(wèn)題,我們采用了分表策略。將鏈接數(shù)據(jù)按照唯一性 ID 對(duì) 64 取余的規(guī)則均勻拆分到 64 張表中,可以有效減輕單一表的壓力,提高數(shù)據(jù)庫(kù)的擴(kuò)展性和性能。
業(yè)務(wù)監(jiān)控是系統(tǒng)關(guān)鍵環(huán)節(jié)之一,旨在實(shí)時(shí)追蹤系統(tǒng)的性能和運(yùn)行狀況,以確保高可用性和高性能。借助轉(zhuǎn)轉(zhuǎn)監(jiān)控系統(tǒng) Prometheus,我們可以收集和展示關(guān)鍵的性能指標(biāo),如生成短鏈鏈接和獲取長(zhǎng)鏈接的請(qǐng)求頻率,鏈接的安全性校驗(yàn)情況等等,使能夠一目了然地查看系統(tǒng)運(yùn)行情況,從而更好地進(jìn)行決策和優(yōu)化。
圖片
通過(guò)深入的研究和實(shí)踐,轉(zhuǎn)轉(zhuǎn)的短鏈平臺(tái)為用戶(hù)提供了高效、安全的鏈接服務(wù)。在不斷發(fā)展的互聯(lián)網(wǎng)環(huán)境下,短鏈平臺(tái)將持續(xù)創(chuàng)新,滿(mǎn)足用戶(hù)不斷變化的需求。
關(guān)于作者:
曹建濤,轉(zhuǎn)轉(zhuǎn)C2C&寄賣(mài)業(yè)務(wù)研發(fā)工程師
本文鏈接:http://m.www897cc.com/showinfo-26-5755-0.html轉(zhuǎn)轉(zhuǎn)短鏈平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 前端請(qǐng)求大比拼:Fetch、Axios、Ajax、XHR
下一篇: 錯(cuò)誤處理策略:Java開(kāi)發(fā)者的MySQL數(shù)據(jù)庫(kù)故障解決方案