聽說(shuō)你會(huì)架構(gòu)設(shè)計(jì)?來(lái),弄一個(gè)交友系統(tǒng)
1. 引言
大家好,我是小?,一個(gè)流浪江湖多年的 985 非科班程序員,曾混跡于國(guó)企、互聯(lián)網(wǎng)大廠和創(chuàng)業(yè)公司的后臺(tái)開發(fā)攻城獅。
1.1 尋找電影般的浪漫
“嘀嗒嘀嗒”,“嘀嗒嘀嗒”,當(dāng)夜幕降臨,你還在代碼的海洋中與 BUG 進(jìn)行著“持久戰(zhàn)”。
突然,你意識(shí)到,生活中不應(yīng)只有鍵盤和屏幕,于是像個(gè)待充電的超人一樣,決定給自己來(lái)點(diǎn)人際交流的活力補(bǔ)給。右手揮舞鼠標(biāo),左手掏出手機(jī),邊關(guān)閉 IDE 邊滑動(dòng) App。
這個(gè)時(shí)候,尋找知己的老難題又閃現(xiàn)在腦海:要不要先檢查一遍今日代碼、再做一次單元測(cè)試,還是直接跳入“尋緣池”?(真實(shí)情況可能是,今天跳入哪個(gè)尋緣池 ?? )
圖片
好不容易做出了一個(gè)勇敢的決定——關(guān)閉電腦,從椅子一躍而起。你拿出手機(jī),點(diǎn)開了熟悉的交友 App。
然后,個(gè)人資料頁(yè)面在屏幕上亮了起來(lái),這可是你走出虛擬世界的敲門磚。
你快速瀏覽著,現(xiàn)實(shí)世界中其他的編程愛(ài)好者、攝影迷、文藝青年...,都在這個(gè)小小的舞臺(tái)中綻放著個(gè)性的光芒。
不需排隊(duì)買飲料,不再擔(dān)心交友聚會(huì)上的尷尬沉默。你滑過(guò)一個(gè)又一個(gè)感興趣的頭像,終于,停留在某個(gè)共鳴的話題上,準(zhǔn)備展開一次思想的交鋒。
1.2 技術(shù)支撐下的交友系統(tǒng)
就像前文所述,人們想要跳出孤獨(dú)的循環(huán),唯一需要的是一臺(tái)手機(jī),一個(gè)友好的交互界面。
那這個(gè)誘人的交友系統(tǒng)是如何誕生的呢?它背后的算法和架構(gòu)又是如何支撐起你我情感交流的橋梁呢?
今天,讓我們一同撩開這個(gè)現(xiàn)代愛(ài)情駭客的神秘面紗,深度解碼交友系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。
在這篇文章中,小?將分享常見(jiàn)交友軟件的系統(tǒng)設(shè)計(jì),探索它是如何在短短幾年內(nèi)從 idea 到蓬勃發(fā)展再到?jīng)]落的(不是,瞎說(shuō)什么大實(shí)話!
2. 需求分析
2.1 Small Chat
在一個(gè)宇宙般無(wú)垠的數(shù)字海洋中,浮現(xiàn)了名為 Small Chat 的愛(ài)情小島。
圖片
這座島不是用巖石建成,而是由一群?jiǎn)紊砉罚瓤龋沂侵竼紊砟信┦謾C(jī)里的一個(gè)個(gè) App 打造而成。說(shuō)起這個(gè) App,它簡(jiǎn)直是孤獨(dú)心靈的救星,一個(gè)紙杯電話 2.0 版,或者說(shuō)是一扇帶你邂逅愛(ài)情奇遇的神奇窗戶。
2.2 功能需求
圖片
打開這款叫做 Small Chat 的 App,就如啟動(dòng)太空艇的第一步,用戶得先登錄自己的小小太空艇——上傳星球生活照,裝飾個(gè)人艙室(自我介紹)。
此時(shí),這位宇航員您可以種下自己的位置信標(biāo),并根據(jù)個(gè)人偏好裝配指南 needle(推薦算法)。
算法這個(gè)家伙和那位算命先生有點(diǎn)像,據(jù)說(shuō)它會(huì)依據(jù)用戶的星際坐標(biāo)和你那閃閃發(fā)亮的個(gè)人信息(據(jù)說(shuō),每個(gè)程序員都認(rèn)為自己是全村最靚的仔),匹配茫茫宇宙中的其他太空艇,它們都和你泊在相鄰的星域。
現(xiàn)在,你就可以在手機(jī)熒光屏上批量欣賞這些來(lái)自銀河系各個(gè)角落的宇航員的艙室(就是 Ta 們的照片和資料)。
要是心中一動(dòng),想要走得更近一些,用戶還可以大膽地向右滑動(dòng)這張星際許可證——就像在說(shuō):“嘿,boy/girl,你在宇宙中并不孤單”!
當(dāng)然,如果兩個(gè)孤獨(dú)的太空艇都向右轉(zhuǎn)了舵,哦,這不就意味著星際之船即將交匯了嗎?這個(gè)時(shí)候,系統(tǒng)就會(huì)像個(gè)熱心的宇航局一樣,發(fā)來(lái)一條信息:“恭喜,你們已經(jīng)成功配對(duì)!”
這時(shí),愛(ài)情的宇宙軌道就開啟了哦!
于是,兩位宇航員就可以開始在私人頻道上暢所欲言,探索彼此的宇宙,看看是否能點(diǎn)燃繁星。
2.3 非功能需求
現(xiàn)在,讓我們來(lái)分析一下 Small Chat 星球的潛在居民數(shù)量。
我們估算在這片浩渺的銀河系中,有超過(guò) 1 億顆孤單的心正在尋找彼此的引力波。因此,我們從 1 億個(gè)星際交流頻道出發(fā),為 Small Chat 的后臺(tái)系統(tǒng)做設(shè)計(jì)。
想象一下,那是一個(gè)可以讓 1 億顆心交織在一起的宇宙網(wǎng)絡(luò)??!
這不僅是技術(shù)的挑戰(zhàn),也是對(duì)愛(ài)情信號(hào)強(qiáng)度的考驗(yàn)。而這,就是我們今天要介紹的 Small Chat ——不只是一個(gè)交友 App,而是銀河系統(tǒng)中一個(gè)關(guān)于愛(ài)情的奇妙設(shè)計(jì)。
3. 概要設(shè)計(jì)
在數(shù)字化的銀河系中, Small Chat 是一個(gè)獨(dú)特的星球,擁有著精妙絕倫的生態(tài)系統(tǒng)。
3.1 整體架構(gòu)
不妨把它想象為一座由微服務(wù)構(gòu)成的未來(lái)城市,這里的每一個(gè)角落都通過(guò)智能網(wǎng)關(guān)保護(hù)著,就像是銀河巡警,確保通道暢通無(wú)阻。
這座未來(lái)城市的每個(gè)街區(qū)都是一個(gè)專門的小微服務(wù)工廠:用戶工廠、鄰近算法工廠、配對(duì)工廠、聊天工廠、還有那個(gè)精確匹配你可能邂逅愛(ài)情坐標(biāo)的推薦工廠。
圖片
在 Small Chat 的系統(tǒng)架構(gòu)中,我們采取了被廣泛認(rèn)可的微服務(wù)架構(gòu)設(shè)計(jì)。
首先,用戶通過(guò)一個(gè)集中的網(wǎng)關(guān)服務(wù)來(lái)接入不同的微服務(wù),你可以將其視為一個(gè)高效的調(diào)度中心,既能保安全,又能提高效率。
然后,用戶的所有請(qǐng)求首先被發(fā)送到這個(gè)網(wǎng)絡(luò)門衛(wèi)——也就是網(wǎng)關(guān)服務(wù)器。這個(gè)網(wǎng)關(guān)服務(wù)器的任務(wù)范圍相當(dāng)廣泛,它既要做好流量的管制工作,保護(hù)系統(tǒng)免受過(guò)多請(qǐng)求的壓垮,也要時(shí)刻警惕潛在的網(wǎng)絡(luò)攻擊,同時(shí)對(duì)用戶的身份和權(quán)限進(jìn)行校驗(yàn)。
此外,網(wǎng)關(guān)服務(wù)器還起到了一個(gè)'中介'的角色,把用戶的請(qǐng)求引導(dǎo)到相應(yīng)的微服務(wù),并將返回的數(shù)據(jù)整合后再展現(xiàn)給用戶。
根據(jù)預(yù)估的用戶級(jí),這個(gè)網(wǎng)關(guān)服務(wù)器需要能夠應(yīng)對(duì)每天高達(dá)千萬(wàn)甚至億萬(wàn)次的訪問(wèn)量。
3.2 業(yè)務(wù)系統(tǒng)
然后是微服務(wù)的各個(gè)具體組件,用戶系統(tǒng)是負(fù)責(zé)管理和存儲(chǔ)用戶個(gè)人信息的模塊,包括用戶的登錄認(rèn)證,所有的用戶都必須通過(guò)這個(gè)服務(wù)來(lái)驗(yàn)證身份才能使用系統(tǒng)的其他功能。
為了處理龐大的數(shù)據(jù)量,這里用到了分片技術(shù)的 MySQL 數(shù)據(jù)庫(kù)系統(tǒng),并將它們放在一個(gè)集群里面,方便彈性伸縮。
分布式對(duì)象存儲(chǔ)集群主要存儲(chǔ)了用戶上傳的圖片、音視頻信息,以及聊天時(shí)用到的表情包圖片或者其它文件信息,文件的元數(shù)據(jù)放置在 DB 存儲(chǔ)。
圖片
此外,為了更高效地提供圖片,我們通過(guò) CDN 服務(wù)緩存了用戶訪問(wèn)頻率較高的熱門圖片,以加速圖片加載速度。
至于配對(duì)系統(tǒng),它則是負(fù)責(zé)用戶互相"右劃"表示喜歡后進(jìn)行配對(duì)的模塊,如果兩個(gè)人互相"右劃"了對(duì)方,這個(gè)服務(wù)就會(huì)將這對(duì)用戶加入到對(duì)方的通訊錄中。
最后,推薦系統(tǒng)的責(zé)任是將可能相互感興趣的用戶推薦給對(duì)方,這需要結(jié)合用戶的行為、興趣愛(ài)好和前述的"配對(duì)"情況來(lái)進(jìn)行智能推薦。
同時(shí),考慮到地理位置的親近性因素,這個(gè)服務(wù)時(shí)常會(huì)與算法團(tuán)隊(duì)密切合作,確保推薦的對(duì)象在地理上也方便用戶進(jìn)行真實(shí)的社交互動(dòng)。
通過(guò)這些微服務(wù)的配合, Small Chat 的平臺(tái)可以以模塊化的方式靈活地?cái)U(kuò)展功能,同時(shí)保證了用戶數(shù)據(jù)處理的效率和安全。
4. 詳細(xì)設(shè)計(jì)
4.1 高并發(fā)挑戰(zhàn)
對(duì)于交友系統(tǒng)來(lái)說(shuō),高并發(fā)處理是確保用戶體驗(yàn)和系統(tǒng)穩(wěn)定性的首要技術(shù)挑戰(zhàn)。對(duì)于一個(gè)可能有著幾千萬(wàn)用戶同時(shí)在線的系統(tǒng)來(lái)說(shuō),維護(hù)系統(tǒng)穩(wěn)定性需要注意以下幾點(diǎn)。
1. 水平擴(kuò)展與負(fù)載均衡
圖片
- 首先,采用無(wú)狀態(tài)的設(shè)計(jì)模式,讓系統(tǒng)后端服務(wù)能夠在多個(gè)處理單元之間進(jìn)行水平擴(kuò)展。這意味著任何一個(gè)單元都可以獨(dú)立處理請(qǐng)求,而不依賴于特定的上下文信息。
- 部署負(fù)載均衡器,將流量分發(fā)到多個(gè)后端服務(wù)器。負(fù)載均衡器可以是硬件負(fù)載均衡器,也可以是如 Nginx 這樣的軟件解決方案,其利用算法(如 輪詢、最小連接數(shù)、一致性哈希 等)智能地將用戶請(qǐng)求分配到處理能力最佳的服務(wù)器節(jié)點(diǎn)。
- 實(shí)現(xiàn)自動(dòng)擴(kuò)縮容機(jī)制,監(jiān)控系統(tǒng)的負(fù)載情況,當(dāng)流量急劇上升,超過(guò)預(yù)置閾值時(shí),自動(dòng)擴(kuò)展服務(wù)器實(shí)例;當(dāng)流量下降時(shí),適當(dāng)減少實(shí)例以節(jié)約成本。
2. 數(shù)據(jù)庫(kù)優(yōu)化和緩存策略
圖片
- 數(shù)據(jù)庫(kù)分區(qū)和分片,將數(shù)據(jù)分布到多個(gè)數(shù)據(jù)庫(kù)中,每個(gè)數(shù)據(jù)庫(kù)只負(fù)責(zé)處理一部分?jǐn)?shù)據(jù),數(shù)據(jù)庫(kù)之間可通過(guò)分布式事務(wù)進(jìn)行數(shù)據(jù)一致性控制。
不了解 DB 分庫(kù)分表的同學(xué)可以看我之前的這篇文章:MySQL高可用,分庫(kù)分表你學(xué)廢了嗎
- 使用讀寫分離模型,通過(guò)主從復(fù)制的方式攤開讀操作的壓力。寫操作只在主數(shù)據(jù)庫(kù)上進(jìn)行,而讀操作則可以在多個(gè)從數(shù)據(jù)庫(kù)上進(jìn)行,這樣可以大幅提高數(shù)據(jù)庫(kù)的讀取性能。
- 引入緩存系統(tǒng),如 Redis 或 Memcached,將頻繁讀取的數(shù)據(jù),如用戶的基礎(chǔ)信息、用戶的交互動(dòng)態(tài)緩存起來(lái)。對(duì)于交友系統(tǒng)來(lái)說(shuō),用戶的動(dòng)態(tài)信息、瞬時(shí)狀態(tài)等可以緩存,減少數(shù)據(jù)庫(kù)的請(qǐng)求次數(shù)。
3. 消息隊(duì)列和異步處理
- 引入消息隊(duì)列,比如 Kafka 或 RabbitMQ,用來(lái)解耦應(yīng)用服務(wù)和后端處理。這允許系統(tǒng)在面對(duì)突發(fā)流量時(shí)把請(qǐng)求排隊(duì),而不是直接在數(shù)據(jù)庫(kù)或服務(wù)層上造成壓力,從而提高整體系統(tǒng)的彈性和響應(yīng)能力。比如,用戶聊天時(shí)可以把消息通知放到隊(duì)列中排隊(duì)處理。
- 異步執(zhí)行耗時(shí)操作,比如用戶的 匹配運(yùn)算、數(shù)據(jù)分析 等可以放在后臺(tái)服務(wù)中異步執(zhí)行,用戶不需要同步等待這些操作完成。特別是用戶匹配機(jī)制,可以放到并發(fā)量小的時(shí)段統(tǒng)一進(jìn)行。
需要要注意的是,以上策略需要遵循微服務(wù)架構(gòu)的原則,將系統(tǒng)拆分為多個(gè)松耦合、易于擴(kuò)展的小型服務(wù),每個(gè)服務(wù)可以單獨(dú)部署,獨(dú)立擴(kuò)展。
通過(guò)這些架構(gòu)層面的優(yōu)化,即便 Small Chat 面臨幾千萬(wàn)到上億級(jí)別的用戶并發(fā)請(qǐng)求,也能保持服務(wù)的高可用性和穩(wěn)定性。
4.2 空間鄰近算法
如何根據(jù)用戶的地理位置尋找距其一定范圍內(nèi)的其他用戶,也是交友系統(tǒng)中必不可少的一個(gè)考慮點(diǎn)。
空間鄰近算法是為了解決 給定一個(gè)點(diǎn),找出距離其最近的點(diǎn) 這一問(wèn)題的算法。在不同的應(yīng)用背景下,會(huì)有不同的考量因素,如精度、效率、存儲(chǔ)需求和實(shí)施的難易程度等,以下是一些常見(jiàn)的空間鄰近算法。
1. 常見(jiàn)的空間鄰近算法:
1)網(wǎng)格(Grid)算法
這種算法是將地理空間簡(jiǎn)單劃分成網(wǎng)格,可以認(rèn)為網(wǎng)格內(nèi)的點(diǎn)是鄰近的。
為提高鄰近好友查詢效率,我們的系統(tǒng)可以按照一定規(guī)則把每位用戶歸類到一個(gè)特定的網(wǎng)格,并在他們的用戶信息里標(biāo)記對(duì)應(yīng)的網(wǎng)格ID(gridID),將位置信息存入 MySQL 中。
這樣,當(dāng)需要查找用戶附近的人時(shí),我們可以將 3*3 的網(wǎng)格視為相近用戶,這樣僅需搜索目標(biāo)用戶所在的那個(gè)網(wǎng)格以及其相鄰的八個(gè)網(wǎng)格內(nèi)的用戶即可。
但是,即便如此,每當(dāng)面對(duì) DB 的高頻訪問(wèn)時(shí),這類查詢?nèi)匀豢赡軙?huì)帶來(lái)負(fù)擔(dān):一方面是太慢,另一方面是不精確,邊界處理也比較復(fù)雜。
為了進(jìn)一步優(yōu)化,我們決定把所有網(wǎng)格及其中的用戶信息都存儲(chǔ)在內(nèi)存中,這樣就可以避免頻繁的 DB 操作。對(duì)于鄰近用戶的查詢,通過(guò)內(nèi)存中的數(shù)據(jù)進(jìn)行計(jì)算即可。
首先,我們可以把所有用戶的經(jīng)緯度信息加載到內(nèi)存中,實(shí)現(xiàn)這一解決方案的關(guān)鍵在于選擇合適的網(wǎng)格尺寸,并能快速確定用戶所在的網(wǎng)格及其周邊網(wǎng)格信息。
實(shí)踐中,通常會(huì)用到 四叉樹網(wǎng)格 和 GeoHash 算法 來(lái)優(yōu)化這一過(guò)程。
2)四叉樹(Quadtree)網(wǎng)格算法
四叉樹網(wǎng)格算法類似網(wǎng)格方法,但是網(wǎng)格的大小是動(dòng)態(tài)分配的。
圖片
它底層使用了四叉樹結(jié)構(gòu)自適應(yīng)地調(diào)整網(wǎng)格大小,以處理用戶密度不同的區(qū)域,這種算法對(duì)不均勻分布的數(shù)據(jù)集表現(xiàn)更好。
具體來(lái)說(shuō),在人口密集區(qū),它通過(guò)細(xì)分網(wǎng)格來(lái)減少每個(gè)網(wǎng)格的用戶量(比如深圳南山、北京海淀);而在人疏少地,網(wǎng)格則相應(yīng)擴(kuò)大(比如一些用戶數(shù)較少的平原地區(qū))。
這種方法保證了每個(gè)網(wǎng)格的用戶數(shù)不超過(guò)設(shè)定閾值(例如 500 人),當(dāng)查詢附近用戶時(shí),算法從四叉樹的根節(jié)點(diǎn)開始逐級(jí)向下,直至抵達(dá)包含目標(biāo)用戶的葉子節(jié)點(diǎn)。為了進(jìn)一步查找鄰近網(wǎng)格用戶,可通過(guò)將所有葉子節(jié)點(diǎn)連成一個(gè)雙向鏈表來(lái)實(shí)現(xiàn)(類型 B+ 樹的網(wǎng)狀結(jié)構(gòu))。
盡管該算法適應(yīng)了很多場(chǎng)景,但編程實(shí)施較復(fù)雜且若網(wǎng)格大小設(shè)置不當(dāng),會(huì)影響搜索性能,接下來(lái)我們?cè)倏?Geohash 算法。
3)Geohash 算法
Geohash 算法是一種將二維空間坐標(biāo)編碼為一維字符串的方法,它可以有效地表示地理位置信息。
圖片
在交友系統(tǒng)中,Geohash 可以用來(lái)索引用戶的位置,以便快速查詢附近的用戶。結(jié)合 Redis 這樣的內(nèi)存數(shù)據(jù)存儲(chǔ),使用 GeoHash 應(yīng)對(duì)大規(guī)模地理位置處理成為可能。
1. 用戶位置編碼
當(dāng)用戶提供自己的位置信息,通常是經(jīng)度和緯度,系統(tǒng)會(huì)使用 GeoHash 算法將這些坐標(biāo)轉(zhuǎn)換為一個(gè)字符串。GeoHash 將地圖劃分為網(wǎng)格,每次劃分會(huì)將網(wǎng)格細(xì)分為更小的區(qū)域,經(jīng)緯度坐標(biāo)每一次細(xì)分都相應(yīng)地在 GeoHash 字符串上增加一個(gè)字符。
2. 存儲(chǔ)用戶位置
得到 GeoHash 字符串后,可以使用 Redis 自帶的地理空間索引 GeoSpatial index(Redis3.2 之后支持),直接使用 GEOADD 命令添加用戶的地理位置信息。
3. 查詢附近的用戶
當(dāng)需要查找一個(gè)用戶的附近用戶時(shí),系統(tǒng)可以做如下操作:
- 首先,獲取查詢用戶的 GeoHash 字符串;
- 使用 Redis 的 GEOSEARCH 或類似的命令,通過(guò)指定中心點(diǎn)(即查詢用戶的位置)和搜索半徑,查詢附近的用戶;
- Redis 會(huì)返回在該區(qū)域內(nèi)的所有用戶 ID 和它們的位置信息。
4. 結(jié)果排序和范圍限制
Redis 的 GEOSEARCH 命令返回的結(jié)果已經(jīng)根據(jù)距離中心點(diǎn)的遠(yuǎn)近排序,查找到的用戶可以進(jìn)一步按實(shí)際距離排序。
如果系統(tǒng)需要對(duì)結(jié)果進(jìn)行限制,如只顯示前10個(gè)最近的用戶,可以在查詢時(shí)指定或者在查詢后處理。
2. 如何選擇
在交友系統(tǒng)中,由于地理位置是不斷變化的,咱們需要一個(gè)可以處理動(dòng)態(tài)數(shù)據(jù)集的算法。并且,為了在大規(guī)模用戶中工作,需要考慮算法的效率和擴(kuò)展性。
GeoHash 由于其簡(jiǎn)單性和易于與其他存儲(chǔ)解決方案結(jié)合使用(如 Redis),在許多現(xiàn)代的定位系統(tǒng)(如 T3 出行、滴滴打車)中非常受歡迎。
所以在 Small Chat 中,我們也使用 GeoHash 算法來(lái)處理位置信息以及附近用戶的匹配機(jī)制。
4.3 推薦算法
推薦算法在交友平臺(tái)中至關(guān)重要,它直接影響用戶的體驗(yàn)和平臺(tái)的留存率。
在 Small Chat 中,我們綜合考慮用戶的互動(dòng)、地理位置等因素來(lái)給用戶打分,并最終生成一個(gè)排名(rank)值,用以推薦其他匹配的用戶。
1. 用戶特征與行為因素
用戶的每一項(xiàng)行為都可能成為加分項(xiàng),比如:
- 活躍度加分:用戶登錄頻率、交互次數(shù)等,表示用戶對(duì)平臺(tái)的參與度。
- 完善度加分:用戶資料的完整性,包括真實(shí)身份認(rèn)證、興趣愛(ài)好、自我介紹等。
- 正面互動(dòng)加分:其他用戶對(duì)該用戶的正面評(píng)價(jià),如點(diǎn)贊、喜歡、私信等響應(yīng)。
- 新鮮度加分:新注冊(cè)用戶或長(zhǎng)時(shí)間未登錄后重新快樂(lè)用戶可能會(huì)有一定加分,這點(diǎn),在很多 moba 手游的匹配機(jī)制里得以充分體現(xiàn),比如 王者榮耀、和平精英 等。
2. 地理位置因素
- 地理鄰近加分:距離用戶較近的其他用戶會(huì)獲得額外加分。這可以通過(guò) GeoHash 位置算法計(jì)算得出。
3. 算法打分機(jī)制
設(shè)置一個(gè)打分系統(tǒng),每個(gè)因素根據(jù)其重要性分配權(quán)重,比如:
- 活躍度權(quán)重:25%
- 資料完善度權(quán)重:20%
- 正面互動(dòng)權(quán)重:30%
- 距離權(quán)重:25%
用戶得分計(jì)算公式可表示為:
UserScore = {活躍度分} * 25% + {最大資料完善度分} * 20% + {最大正面互動(dòng)分} * 30% + {最大距離分} * 25%
4. 推薦列表的生成
得到每個(gè)用戶的得分后,為目標(biāo)用戶生成推薦列表的過(guò)程如下:
- 用戶相似性計(jì)算:首先,通過(guò)用戶的行為和資料完善度找到傾向上相似的用戶。
- 位置篩選:其次,利用位置信息篩選出距離合適的候選人。
- 綜合得分排序:根據(jù)上述的得分機(jī)制對(duì)所有篩選后的用戶計(jì)算得分,得到每個(gè)用戶的排名值。
- 推薦列表生成:最后,根據(jù)得分從高到低排列用戶,生成推薦列表。
為了優(yōu)化響應(yīng),我們可以將一定范圍的 Rank 列表保存到 Redis 的 Sorted Set 里。其中 key 為用戶 Id, score 字段為推薦度分?jǐn)?shù),field 列為被推薦的用戶 Id。
5. Rank值的更新
Rank 值不是靜態(tài)的,它應(yīng)隨著用戶行為的變化動(dòng)態(tài)更新。比如,用戶的活躍度可以是逐日遞減的,而一次新的正面互動(dòng)則能帶來(lái)即時(shí)的得分提升。
在實(shí)踐中,可以通過(guò)設(shè)定定時(shí)任務(wù),如每日或每周更新一次用戶得分。對(duì)于即時(shí)性較強(qiáng)的操作(如互動(dòng)行為),可以觸發(fā)即時(shí)的得分更新流程。
5. 小結(jié)
以上,我們對(duì)現(xiàn)代交友系統(tǒng)的一些常見(jiàn)技術(shù)難點(diǎn)做了一個(gè)大致的剖析,從用戶對(duì)浪漫邂逅的渴望出發(fā),到細(xì)致的技術(shù)構(gòu)建。
Small Chat 系統(tǒng)不僅讓屏幕前的很多單身貴族與各種可能的緣分相遇,更在龐大訪問(wèn)壓力下,展示了其穩(wěn)定的架構(gòu)。通過(guò)微服務(wù)、負(fù)載均衡、數(shù)據(jù)庫(kù)優(yōu)化、緩存、異步處理和空間鄰近算法的使用,讓一個(gè)可擴(kuò)展、高效且個(gè)性化的交友應(yīng)用得以呈現(xiàn)。