基於golang分散式爬蟲系統的架構體系v1.0

雨夜的部落格 發表於 2021-05-03

基於golang分散式爬蟲系統的架構體系v1.0


一、什麼是分散式系統


分散式系統是一個硬體或軟體元件分佈在不同的網路計算機上,彼此之間僅僅通過訊息傳遞進行通訊和協調的系統。簡單來說就是一群獨立計算機集合共同對外提供服務,但是對於系統的使用者來說,就像是一臺計算機在提供服務一樣。分散式意味著可以採用更多的普通計算機(相對於昂貴的大型機)組成分散式叢集對外提供服務。計算機越多,CPU、記憶體、儲存資源等也就越多,能夠處理的併發訪問量也就越大。

從分散式系統的概念中我們知道,各個主機之間通訊和協調主要通過網路進行,所以分散式系統中的計算機在空間上幾乎沒有任何限制,這些計算機可能被放在不同的機櫃上,也可能被部署在不同的機房中,還可能在不同的城市中,對於大型的網站甚至可能分佈在不同的國家和地區。

二、分散式系統的特點


不同的資料介紹起分散式系統的特點,雖然說法不同,但都大同小異,此處我們針對於要實現的分散式爬蟲,總結為以下3個特點:

多個節點

容錯性

可擴充套件性(效能)

固有分佈性

訊息傳遞

節點具有私有儲存

易於開發

可擴充套件性(功能)

對比:平行計算

完成特定需求

訊息傳遞的方法:

REST

RPC

中介軟體

三、需求說明設計要點


在爬蟲的開發過程中,有些業務場景須要同一時候抓取幾百個甚至上千個站點,此時就須要一個支援多爬蟲的框架。在設計時應該要注意下面幾點:

程式碼複用。功能模組化。假設針對每一個站點都寫一個完整的爬蟲。那當中必然包括了很多反覆的工作。不僅開發效率不高。並且到後期整個爬蟲專案會變得臃腫、難以管理。

易擴充套件。多爬蟲框架,這最直觀的需求就是方便擴充套件。新增一個待爬的目標站點,我僅僅須要寫少量 必要的內容(如抓取規則、解析規則、入庫規則),這樣最快 最好。

健壯性、可維護性。

這麼多站點同一時候抓取,報錯的概率更大。比如斷網、中途被防爬、爬到“髒資料”等等。所以必須要做好日誌監控,能實時監控爬蟲系統的狀態,能準確、具體地定位報錯資訊;另外要做好各種異常處理,假設你放假回來發現爬蟲由於一個小問題已經掛掉了,那你會由於浪費了幾天時間而可惜的(儘管其實我個人會不時地遠端檢視爬蟲狀態)。

分散式。多站點抓取。資料量一般也比較大,可分散式擴充套件。這也是必需的功能了。分散式。須要注意做好訊息佇列。做好多結點統一去重。

爬蟲優化。

這就是大話題了,但最主要的。框架應該要基於非同步,或者使用協程+多程式。

四、專案架構分析

基於golang分散式爬蟲系統的架構體系v1.0

4.1 去重問題


可以嘗試寫布隆過濾器來更快的實現改需求

  • 問題:

  • 單節點承受的去重資料量有限

  • 無法儲存之前去重結果(因為是存入到記憶體(map))

  • 解決:

  • 基於Key-Value Stroe(如Redis)進行分散式去重

4.2 資料儲存問題

問題:

  • 儲存部分的結構,技術棧和爬蟲部分割槽別很大

  • 進一步優化需要特殊的ElasticSearch技術背景

  • 解決:

  • 儲存服務

複雜分散式爬蟲系統的大框架,具體實現的時候,還有很多的細節需要處理,這時,之前做過爬蟲系統,踩過坑的經驗就很重要了。