Facebook使用一个名为Sigma的系统打击垃圾邮件、恶意软件及其它恶意行为。该系统的任务是主动发现这些行为,并自动删除检测到的不良内容,避免它们在用户的动态消息中显示。最近,他们完成了为期两年的Sigma重新设计工作,用 Haskell 取代了仅在Facebook内部使用的 FXL语言 。现在,基于Haskell的Sigma系统已经应用于生产环境,每秒为100多万请求提供服务。对于像Sigma这样的大型生产系统而言,Haskell不是一个常用的选项。Simon Marlow是一名Facebook软件工程师,同时也是Haskell社区的领军人物。近日,他 撰文 解释了他们做出这种选择的原因,并分享了经验。
Sigma是一个规则引擎,就是说它运行一组规则,Facebook称之为策略。Sigma会用那些规则评估Facebook上的每次交互,以便识别和阻止恶意交互,防止它们影响Facebook用户。策略是持续部署的,任何时候,代码库中的源代码都是Sigma中运行的代码。这样,它们可以对新出现的恶意行为作出快速响应。同时,这也要求他们用于编写策略的语言是安全的。
起初,他们使用自己设计的FXL语言编写策略,但随着扩展性需求和复杂性的增加,FXL不再是理想的选择。它缺少一些抽象机制,比如用户定义类型和模块,而且它的实现是以一个解释器为基础,速度不够快。因此,他们希望选用一种现有的语言。下面是他们重点考虑的几个因素:
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 活动视频。
感谢郭蕾对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群 )。