[关闭]
@lsmn 2015-08-11T06:37:44.000000Z 字数 2433 阅读 2715

Facebook如何使用Haskell处理垃圾邮件

Facebook Haskell Sigma FXL GHC


摘要

最近,Facebook完成了为期两年的Sigma重新设计工作,用Haskell取代了仅在内部使用的FXL语言。现在,基于Haskell的Sigma系统已经应用于生产环境,每秒为100多万请求提供服务。对于像Sigma这样的大型生产系统而言,Haskell不是一个常用的选项。Simon Marlow是一名Facebook软件工程师,同时也是Haskell社区的领军人物。近日,他撰文解释了他们做出这种选择的原因,并分享了经验。

正文

Facebook使用一个名为Sigma的系统打击垃圾邮件、恶意软件及其它恶意行为。该系统的任务是主动发现这些行为,并自动删除检测到的不良内容,避免它们在用户的动态消息中显示。最近,他们完成了为期两年的Sigma重新设计工作,用Haskell取代了仅在Facebook内部使用的FXL语言。现在,基于Haskell的Sigma系统已经应用于生产环境,每秒为100多万请求提供服务。对于像Sigma这样的大型生产系统而言,Haskell不是一个常用的选项。Simon Marlow是一名Facebook软件工程师,同时也是Haskell社区的领军人物。近日,他撰文解释了他们做出这种选择的原因,并分享了经验。

Sigma是一个规则引擎,就是说它运行一组规则,Facebook称之为策略。Sigma会用那些规则评估Facebook上的每次交互,以便识别和阻止恶意交互,防止它们影响Facebook用户。策略是持续部署的,任何时候,代码库中的源代码都是Sigma中运行的代码。这样,它们可以对新出现的恶意行为作出快速响应。同时,这也要求他们用于编写策略的语言是安全的。

起初,他们使用自己设计的FXL语言编写策略,但随着扩展性需求和复杂性的增加,FXL不再是理想的选择。它缺少一些抽象机制,比如用户定义类型和模块,而且它的实现是以一个解释器为基础,速度不够快。因此,他们希望选用一种现有的语言。下面是他们重点考虑的几个因素:

  1. 纯函数式强类型语言:确保策略不会在无意间相互交互,可以单独测试,并且不会导致Sigma系统崩溃;强类型有助于在策略部署到生产环境之前减少许多Bug;
  2. 自动批处理和并发获取数据:策略通常需要从Facebook的其它系统获取数据,为了提高效率,他们希望系统默认使用并发,即隐式并发;
  3. 在几分钟内将修改后的代码推送到生产环境,即他们可以快速部署或更新策略;
  4. 性能:FXL性能较差,他们需要使用C++开发一些对性能要求较高的功能,增加了变更发布时间;
  5. 支持交互式开发:开发人员可以交互地试验和测试策略代码并立即看到结果。

Haskell非常适合:它是强类型的纯函数式语言,有成熟的优化编译器和交互式环境(GHCi),并且有他们需要的抽象机制。此外,它还有丰富的库和活跃的开发者社区。因此,上述列表中还有两项特性有待处理:

Haskell位于Sigma中两个C++层之间。上面一层是C++ thrift服务器。其实,这里也可以用Haskell作为thrift服务器,但C++ thrift服务器更成熟,性能更好,功能更丰富,并且可以与下面的Haskell层无缝集成,因为他们可以从C++调用Haskell。最底层是与外围服务交互的C++客户端代码。他们使用Haskell的外部函数接口(FFI)将C++客户端封装成一个Haxl数据源,那样,他们就可以从Haskell使用它。

他们对Sigma所服务的25种常见类型的请求进行了测试。结果表明,对于特定的请求,Haskell的性能是FXL的3倍。Haskell的吞吐量整体上比FXL高20%到30%。为了,他们做了大量艰苦的工作,优化Haskell代码,确定和解决性能瓶颈,其中包括修改GHC的堆管理方式修复Haskell JSON解析框架aeson的一个性能缺陷等。

此外,Simon还介绍了其它几项重要的工作,包括:

要了解更多信息,可以查看Protect the Graph页面,或者观看他们最近的反垃圾邮件@Scale活动视频。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注