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