基於golang分散式爬蟲系統的架構體系v1.0
一、什麼是分散式系統
分散式系統是一個硬體或軟體元件分佈在不同的網路計算機上,彼此之間僅僅通過訊息傳遞進行通訊和協調的系統。簡單來說就是一群獨立計算機集合共同對外提供服務,但是對於系統的使用者來說,就像是一臺計算機在提供服務一樣。分散式意味著可以採用更多的普通計算機(相對於昂貴的大型機)組成分散式叢集對外提供服務。計算機越多,CPU、記憶體、儲存資源等也就越多,能夠處理的併發訪問量也就越大。
從分散式系統的概念中我們知道,各個主機之間通訊和協調主要通過網路進行,所以分散式系統中的計算機在空間上幾乎沒有任何限制,這些計算機可能被放在不同的機櫃上,也可能被部署在不同的機房中,還可能在不同的城市中,對於大型的網站甚至可能分佈在不同的國家和地區。
二、分散式系統的特點
不同的資料介紹起分散式系統的特點,雖然說法不同,但都大同小異,此處我們針對於要實現的分散式爬蟲,總結為以下3個特點:
多個節點
容錯性
可擴充套件性(效能)
固有分佈性
訊息傳遞
節點具有私有儲存
易於開發
可擴充套件性(功能)
對比:平行計算
完成特定需求
訊息傳遞的方法:
REST
RPC
中介軟體
三、需求說明設計要點
在爬蟲的開發過程中,有些業務場景須要同一時候抓取幾百個甚至上千個站點,此時就須要一個支援多爬蟲的框架。在設計時應該要注意下面幾點:
程式碼複用。功能模組化。假設針對每一個站點都寫一個完整的爬蟲。那當中必然包括了很多反覆的工作。不僅開發效率不高。並且到後期整個爬蟲專案會變得臃腫、難以管理。
易擴充套件。多爬蟲框架,這最直觀的需求就是方便擴充套件。新增一個待爬的目標站點,我僅僅須要寫少量 必要的內容(如抓取規則、解析規則、入庫規則),這樣最快 最好。
健壯性、可維護性。
這麼多站點同一時候抓取,報錯的概率更大。比如斷網、中途被防爬、爬到“髒資料”等等。所以必須要做好日誌監控,能實時監控爬蟲系統的狀態,能準確、具體地定位報錯資訊;另外要做好各種異常處理,假設你放假回來發現爬蟲由於一個小問題已經掛掉了,那你會由於浪費了幾天時間而可惜的(儘管其實我個人會不時地遠端檢視爬蟲狀態)。
分散式。多站點抓取。資料量一般也比較大,可分散式擴充套件。這也是必需的功能了。分散式。須要注意做好訊息佇列。做好多結點統一去重。
爬蟲優化。
這就是大話題了,但最主要的。框架應該要基於非同步,或者使用協程+多程式。
四、專案架構分析
4.1 去重問題
可以嘗試寫布隆過濾器來更快的實現改需求
-
問題:
-
單節點承受的去重資料量有限
-
無法儲存之前去重結果(因為是存入到記憶體(map))
-
解決:
-
基於Key-Value Stroe(如Redis)進行分散式去重
4.2 資料儲存問題
問題:
-
儲存部分的結構,技術棧和爬蟲部分割槽別很大
-
進一步優化需要特殊的ElasticSearch技術背景
-
解決:
-
儲存服務
複雜分散式爬蟲系統的大框架,具體實現的時候,還有很多的細節需要處理,這時,之前做過爬蟲系統,踩過坑的經驗就很重要了。