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