Facebook使用Haskell与爬虫战斗

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

我以前提倡的隐式并发被Facebook使用Haskell+Haxl实现了:
只要你编写好函数方法,安全性与并发性就无形中得到了解决,不用专门去思考并发,有意识地去使用并发组件模型编程。