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

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


一、什麼是分佈式系統


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

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

二、分佈式系統的特點


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

多個節點

容錯性

可擴展性(性能)

固有分佈性

消息傳遞

節點具有私有存儲

易於開發

可擴展性(功能)

對比:並行計算

完成特定需求

消息傳遞的方法:

REST

RPC

中間件

三、需求說明設計要點


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

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

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

健壯性、可維護性。

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

分佈式。多站點抓取。數據量一般也比較大,可分佈式擴展。這也是必需的功能了。分佈式。須要注意做好消息隊列。做好多結點統一去重。

爬蟲優化。

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

四、項目架構分析

4.1 去重問題


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

  • 問題:

  • 單節點承受的去重數據量有限

  • 無法保存之前去重結果(因為是存入到內存(map))

  • 解決:

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

4.2 數據存儲問題

問題:

  • 存儲部分的結構,技術棧和爬虫部分區別很大

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

  • 解決:

  • 存儲服務

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