關(guān)于Instgram的搜索架構(gòu)簡(jiǎn)要分析
大小:0.4 MB 人氣: 2017-10-10 需要積分:1
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
標(biāo)簽:instgram(2266)
Instagram的優(yōu)勢(shì)在于:雖然公司規(guī)模小,卻擁有相對(duì)大得多的基礎(chǔ)設(shè)施架構(gòu),在恰當(dāng)?shù)臅r(shí)候還能利用資源以借助Facebook十年來積累的經(jīng)驗(yàn)。Facebook的“Unicorn”搜索架構(gòu)是一款以社交圖譜為基礎(chǔ)的搜索引擎,可擴(kuò)展至包含上萬億個(gè)文檔的索引。2015年初,Instagram將所有的搜索架構(gòu)從Elasticsearch轉(zhuǎn)到Unicorn。同一時(shí)期,Instagram的搜索流量增加了65%,這不僅是用戶群數(shù)量增加的結(jié)果,也是忠實(shí)用戶數(shù)(每次使用搜索引擎時(shí)都會(huì)使用Instagram)增長(zhǎng)了12%的結(jié)果。這樣的成果部分得益于Unicorn通過社交功能及二階連接執(zhí)行查詢排序的能力。在7.0升級(jí)后,通過對(duì)圖譜的各個(gè)部分編制索引,Instagram的搜索能力更強(qiáng),可以更迅速、更便捷地搜索任何想要查找的信息,包括人、地點(diǎn)、標(biāo)簽與媒體。
什么是搜索?
Instagram的搜索架構(gòu)包含了所有興趣實(shí)體,如:標(biāo)簽、位置、用戶及媒體,這些內(nèi)容以非規(guī)范化的形式儲(chǔ)存,通常被稱為文檔——它們被分組歸類到集合中,可通過高效的集合運(yùn)算(如AND、OR與NOT)來查詢,在實(shí)際操作中Instagram對(duì)運(yùn)算結(jié)果高效地排序篩選,只留下與指定查詢最相關(guān)的文檔。當(dāng)用戶查詢時(shí),服務(wù)器后端會(huì)將查詢轉(zhuǎn)換成編碼,進(jìn)行集合運(yùn)算后篩出最佳匹配結(jié)合的有序集合。
數(shù)據(jù)錄入
Instagram每秒可處理數(shù)百萬個(gè)搜索請(qǐng)求,其中很多如注冊(cè)、點(diǎn)贊和上傳在內(nèi)的請(qǐng)求需要修改現(xiàn)有記錄,并向主PostSQL數(shù)據(jù)庫增加新行。為了確保可搜索文件的集合正確,我們需要將這些變更告知搜索架構(gòu)。此外,在PostgreSQL數(shù)據(jù)庫中,搜索時(shí)一般需要不只一行的信息,例如在照片上傳后,該用戶帳號(hào)的歷史信息也會(huì)用在搜索中。
為了解決非規(guī)范化的問題,Instagram引入了Slipstream系統(tǒng),該系統(tǒng)會(huì)對(duì)Instagram上的event進(jìn)行編碼,再錄入包含更多信息的Thrift架構(gòu)中。這些event以二進(jìn)制序列化格式存儲(chǔ),通過異步發(fā)送-訂閱頻道(Firehose)來發(fā)送。譬如“搜索”功能之類的消費(fèi)者訂閱到Firehose,過濾掉不相干的event,再對(duì)其余event作出反應(yīng)。Firehose在Facebook的Scribe頂端實(shí)現(xiàn),讓消息傳輸可以異步實(shí)現(xiàn)。
下圖展示了該架構(gòu):
自系統(tǒng)化之后,Thrift中跨請(qǐng)求對(duì)象再次復(fù)用;同時(shí)無需自定義反序列化,消費(fèi)者便可直接消費(fèi)所傳遞的信息。Slipstream架構(gòu)中與照片對(duì)應(yīng)的子集如下所示:
struct User { 1: required i64 id; 2: string username; 3: string fullname; 4: bool is_private; 。..} struct Media { 1: required i64 id; 2: required i64 owner_id; 3: required MediaContentType content_type; 。..} struct LikeEvent { 1: required i64 liker_id; 2: required i64 media_id; 3: required i64 media_owner_id; 4: Media media; 5: User liker; 6: User media_owner; 。..8: bool is_following_media_owner; } union InstagramEvent { 。..2: LikeEvent like; 。..} struct FirehoseEvent { 1: required i64 server_time_millis; 2: required InstagramEvent event; }
Firehose頻道的信息作為best-effort delivery,在消息傳遞中預(yù)計(jì)只有很小比例的數(shù)據(jù)丟失。在搜索時(shí),我們通過數(shù)據(jù)核對(duì)進(jìn)程或base build建立起最終一致性:每天晚上都會(huì)對(duì)Instagram連接到Hive的所有PostgreSQL數(shù)據(jù)庫進(jìn)行截圖存檔,并定期在這些Hive表格與結(jié)構(gòu)中查詢每個(gè)垂直搜索的所有文檔;將base build與從Slipstream中獲取的數(shù)據(jù)相合并,以確保在數(shù)據(jù)丟失的情況下,系統(tǒng)也保持最終一致性。
數(shù)據(jù)輸出
處理查詢
如果數(shù)據(jù)正確接收,則搜索架構(gòu)可在一定的約束下高效提取相關(guān)的文檔,我們稱之為“約束查詢(constraint a query)”,一般是根據(jù)用戶提供的文字(例如:用戶輸入“Justin”,實(shí)際想搜索Justin Bieber)所衍生。在Unicorn中,查詢被重寫為明確表達(dá)目的的S-Expressions,比如:
(anduser:maxime(applyfollowed_by: followed_by:me))
以上代碼翻譯過來就是:查找我關(guān)注、名叫maxime的人所關(guān)注的人。在搜索架構(gòu)中,這個(gè)過程分兩步處理:
生成候選集:找出一組與給定查詢匹配的文檔,Instagram的服務(wù)器后端使用反向索引(reverse index)結(jié)構(gòu),即通過關(guān)鍵詞索引找到多組文檔。舉例來說,輸入關(guān)鍵詞“name:justin”就會(huì)出現(xiàn)包含“justin”的用戶名集合。
排序:從所有候選集中選出最佳文檔。獲取候選文檔后,從文檔的元數(shù)據(jù)編碼中找出特征,例如:用戶Justin Bieber的特征之一是關(guān)注者多達(dá)3.23千萬。系統(tǒng)會(huì)將這些特征用于計(jì)算“擬合度值(goodness)”,以便對(duì)候選子集進(jìn)行排序。擬合度可通過機(jī)器學(xué)習(xí)或手動(dòng)調(diào)整而生成——在機(jī)器學(xué)習(xí)案例中,針對(duì)特定候選者,我們可以設(shè)計(jì)點(diǎn)擊或關(guān)注有所差異的特征。
通過這兩個(gè)步驟,最終得出指定查詢的最佳文檔有序列表。
社交圖譜搜索
在優(yōu)化搜索功能時(shí),為了提供更具個(gè)性化的搜索結(jié)果,Instagram現(xiàn)在會(huì)將用戶關(guān)注的人以及他們所關(guān)注的人都納入搜索范圍。這樣一來,基于用戶所關(guān)注的人再來查找某人會(huì)更容易。
使用Unicorn后,我們能夠?qū)nstagram上的所有帳號(hào)、媒體、標(biāo)簽和地址,還有其間各類關(guān)系生成索引。舉例來說,通過對(duì)某個(gè)用戶的關(guān)注者編輯索引,Unicorn可以回答這類問題:
“用戶X與用戶Y同時(shí)關(guān)注的賬號(hào)有哪些?”
同樣的,通過對(duì)媒體中的位置進(jìn)行索引,Unicorn能得出如下信息:
“我關(guān)注的帳號(hào)所發(fā)布的媒體是在紐約拍攝的”。
優(yōu)化帳號(hào)搜索功能
單獨(dú)使用Instagram的圖譜的話體驗(yàn)不佳,不足以找到想要查找的帳號(hào),必須結(jié)合Unicorn的搜索排序架構(gòu)使用才能奏效。
完成這一目標(biāo)的方法之一是在Instagram上為現(xiàn)有連接建立模型。在Facebook上,賬號(hào)間的基本關(guān)系是非定向的(通常會(huì)互加好友),而在Instagram上卻不一定要回粉。我們的團(tuán)隊(duì)必須對(duì)搜索排序算法進(jìn)行修改,以存儲(chǔ)并檢索Instagram關(guān)注圖譜中的帳號(hào)信息。對(duì)Instagram來說,要使用Unicorn按照混合的方式來檢索帳號(hào):“你關(guān)注的人所關(guān)注的人”和“關(guān)注你的人所關(guān)注的其他人”。
此外,Instagram的用戶關(guān)注彼此的原因各種各樣,某位用戶無需與他所關(guān)注的用戶保持完全一致的興趣點(diǎn)。我們的團(tuán)隊(duì)構(gòu)建了一個(gè)模型,針對(duì)每個(gè)用戶所關(guān)注的帳號(hào)進(jìn)行排序,因此在搜索時(shí),與搜索者關(guān)系更為密切的用戶所關(guān)注的對(duì)象會(huì)優(yōu)先顯示。
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%