如何實(shí)現(xiàn)一個(gè)支持海量大并發(fā)的服務(wù)?
一、前言
提到“海量大并發(fā)”,一般人首先想到的也許是春運(yùn)期間的“12306”,或者曾經(jīng)風(fēng)光無二的“天貓雙十一”。尤其是12306,據(jù)說其在春運(yùn)期間的QPS(Queries-per-second 每秒查詢率)達(dá)到100萬。
然而,無論“12306”或是“天貓雙十一”的并發(fā)有多高,其都注定無法超越另一個(gè)網(wǎng)絡(luò)服務(wù)的并發(fā)量,它們?cè)俅蟮牟l(fā)都只能算這個(gè)服務(wù)所承受并發(fā)的一部分,甚至可能還是比較小的那部分,這個(gè)服務(wù)就是:DNS。
DNS為全球所有的互聯(lián)網(wǎng)(Internet)用戶提供域名解析服務(wù),這些用戶除了自然人,甚至包括大量自動(dòng)運(yùn)行的程序。DNS服務(wù)對(duì)互聯(lián)網(wǎng)而言,如同空氣一樣重要,又如同空氣一樣無形。它是如此穩(wěn)定而透明,就像不存在一樣,實(shí)際卻承受著幾乎全世界最大的并發(fā)壓力,而且是一年365天,時(shí)時(shí)刻刻都承受著。
而無論是“12306”還是“天貓雙十一”,它們所承受的并發(fā)再大,終究是要通過請(qǐng)求域名的方式來進(jìn)行,所以它們的壓力只會(huì)是DNS系統(tǒng)所承受壓力的一部分。所以,如果你想研究“海量大并發(fā)”,不用看那些“解密12306”的文章,踏踏實(shí)實(shí)把DNS的原理搞透徹,這"海量大并發(fā)"的絕世武功基本就是你的了。
二、關(guān)于DNS
那DNS是怎么做的呢?
要支持如此巨量的并發(fā),可以肯定的是,僅僅依靠軟件是不夠的,還需要相配套的硬件支持。所以首先需要足夠數(shù)量的服務(wù)器,并將其廣泛架設(shè)在用戶群體之中,這里的第一批服務(wù)器就是“頂級(jí)域名服務(wù)器”。
頂級(jí)域名服務(wù)器是一個(gè)集群,整體而言就像一個(gè)“內(nèi)閣”,這個(gè)內(nèi)閣會(huì)服務(wù)于一位皇帝,而這位皇帝就是“根域名服務(wù)器”。嚴(yán)格按照DNS系統(tǒng)來說,其實(shí)不止一位“皇帝”,即根域名服務(wù)器其實(shí)也遠(yuǎn)不止一臺(tái),這里為了簡化模型就假定只有一個(gè)。
每臺(tái)頂級(jí)域名服務(wù)器就是“內(nèi)閣大臣”,它們共同分擔(dān)皇帝的壓力。但內(nèi)閣是直接輔佐皇帝的,并不直接承擔(dān)業(yè)務(wù)壓力,所以在頂級(jí)域名服務(wù)器之下,又有一個(gè)集群,那就是“權(quán)威域名服務(wù)器”。
權(quán)威域名服務(wù)器就像設(shè)置在各個(gè)行省的“總督”,每個(gè)總督直接負(fù)責(zé)自己的一片區(qū)域,接受該區(qū)域的用戶進(jìn)行域名注冊(cè),并對(duì)這些域名提供解析服務(wù)。但即便是這些權(quán)威域名服務(wù)器,除了接受域名注冊(cè)請(qǐng)求外,一般也不直接對(duì)普通用戶提供域名解析服務(wù),而是交由“本地域名服務(wù)器”來做。
圖片
可是用戶的域名注冊(cè)信息都在“權(quán)威域名服務(wù)器”中,他找“本地域名服務(wù)器”做解析服務(wù),后者怎么知道對(duì)應(yīng)IP呢?
在開始時(shí)它當(dāng)然不知道,所以本地域名服務(wù)器會(huì)直接上奏“DNS皇帝”這個(gè)情況,即直接請(qǐng)求根域名服務(wù)器。
以abc.com域名為例,根域名服務(wù)器收到某個(gè)本地域名服務(wù)器的解析服務(wù)請(qǐng)求后,它可以通過abc.com這個(gè)地址的頂級(jí)域名com得知負(fù)責(zé)此域名的頂級(jí)域名服務(wù)器,于是就會(huì)將域名解析請(qǐng)求轉(zhuǎn)給它。
頂級(jí)域名服務(wù)器通過abc.com這個(gè)地址的abc查詢,得知這個(gè)二級(jí)域名當(dāng)初是交給哪個(gè)權(quán)威域名服務(wù)器管理后,就將解析請(qǐng)求交給那個(gè)權(quán)威域名服務(wù)器。于是這個(gè)權(quán)威域名服務(wù)器再查看普通用戶在它這里的注冊(cè)信息,于是找到abc.com對(duì)應(yīng)的IP,將其返回給頂級(jí)域名服務(wù)器。
接下來頂級(jí)域名服務(wù)器將結(jié)果繼續(xù)返回給根域名服務(wù)器,根域名服務(wù)器再返回給本地域名服務(wù)器,本地域名服務(wù)器最終將結(jié)果IP返回給用戶主機(jī)。
圖片
在這種方式中,本地域名服務(wù)器只用和根域名服務(wù)器打交道,叫“遞歸查詢”,但它不是唯一的查詢方式。
還有一種方式是,根域名服務(wù)器在得知負(fù)責(zé)abc.com這個(gè)域名的頂級(jí)域名服務(wù)器的IP后,會(huì)直接返回給本地域名服務(wù)器,讓本地域名服務(wù)器自己去請(qǐng)求頂級(jí)域名服務(wù)器,而不是代為請(qǐng)求。后面請(qǐng)求權(quán)威域名服務(wù)器也是同理,這種方式就叫“迭代查詢”。
圖片
本地域名服務(wù)器在獲知用戶abc.com這個(gè)域名的IP后,一方面它會(huì)將結(jié)果返回給用戶主機(jī),另一方則會(huì)將此結(jié)果緩存,這樣下次有用戶再請(qǐng)求這個(gè)域名時(shí),它就可以直接返回結(jié)果了。
這里必須著重強(qiáng)調(diào)下緩存,它是整個(gè)分布式架構(gòu)中的重要組成部分,是分擔(dān)系統(tǒng)壓力的重要機(jī)制。
通過這樣一個(gè)分布式的分層架構(gòu),海量的域名解析請(qǐng)求就被分?jǐn)偟街辽?層主機(jī)中了,再配合本地域名服務(wù)器的緩存,整個(gè)DNS系統(tǒng)中每臺(tái)服務(wù)器的實(shí)際壓力都會(huì)減少很多。于是看起來很恐怖的并發(fā)量,在眾多服務(wù)器以及緩存的共同支撐之下,就顯得不是那么困難了。
三、總結(jié)
DNS的域名解析服務(wù)可以如此處理,其他各種類型的服務(wù)亦是如此,區(qū)別只是并發(fā)請(qǐng)求的內(nèi)容,但應(yīng)對(duì)并發(fā)本身的手段是可以相互參考的。