Facebook使用Haskell與爬蟲戰鬥

banq發表於2015-08-05
Facebook打擊垃圾郵件,惡意軟體,和其他爬蟲攻擊行為的系統稱為Sigma。它的工作是主動識別Facebook上的惡意行為,如垃圾郵件,網路釣魚攻擊,惡意軟體的連結和不良內容,這些被Sigma檢測以後會自動刪除。

原先使用FXL語言編寫Sigma,但是隨著規模發展越來越不適應,他們選擇替代語言的要求是:
1. 純函式和強型別. 這能確保反爬蟲策略規則不會彼此影響,也不會將Sigma搞崩潰,易於隔離測試;強型別在進入生產之前能夠幫助消滅許多bugs.

2. 自動批處理和重疊的資料獲取。Facebook的反爬蟲策略通常從其他系統獲取資料,所以要儘可能採用併發提高效率。我們希望併發是隱式的,所以工程師編寫反爬蟲策略時,可以集中精力在業務上,如何打擊垃圾爬蟲,而同時不用擔心併發性。隱式併發也可以防止程式碼功能不會因追求效率效能而變得凌亂模糊,從而使得程式碼難以理解和修改。

3. 分分鐘將程式碼變動推送到生產現場,這會啟用我們快速部署修改後的反爬蟲策略。

4. 效能. FXL的效能很慢,意味著我們需要編寫對效能要求高的功能時,需要採取C++,這有很多問題。

5. 支援互動式開發,基於爬蟲策略工作的開發者要能夠互動體驗和測試它們的程式碼,能夠立即看見結果。

Haskell是一個純粹的函式式和強型別的語言,它有一個成熟的最佳化編譯器和互動式環境(GHCi)。它還有我們所有需要的抽象設施,它提供一組豐富的庫,它是由一個活躍的開發者社群的支援。

需要解決的就剩下兩個問題:(1) 自動批處理和併發 (2) 編譯程式碼的熱交換hot-swapping 。

在Haskell中所有現有的併發都是顯式的,意味著使用者需要明確指定使用併發獲取什麼東西。比如資料獲取,可以視為一個純粹的函式操作,我們Facebook想要一個程式設計模型是,程式設計師不必使用顯式並行併發語句,這種系統就能利用任何可用併發實現(隱式併發)。因此,Facebook開發了Haxl框架來解決這個問題:Haxl可使多個資料的提取操作自動化批處理和併發地執行。

Haxl Github

使用Haskell以後,Sigma能夠每秒處理一百萬個請求。

關於編譯程式碼的熱交換和其他內容可見原文:

Fighting spam with Haskell

相關文章