低延迟系统实践
英文原文:11 Best Practices for Low Latency Systems
自从Google发布额外的一个500ms延迟将减少20%的流量以及亚马逊发现额外的100ms延迟会使销售量下降1%已经8年了。此后,开发者们一直奋战在延迟曲线的底部,甚至前端开发者们都在压缩JavaScript、CSS以及HTML来争取分毫时间。以下是各种低延迟系统设计时需牢记在心的最佳实践的一个概览。大多数这些建议考虑的是逻辑上极端,可以权衡使用。(感谢在Quora上问这个问题的匿名用户,这让我把我的想法写了下来)。
选择正确的语言
脚本语言不要使用,尽管它们越来越快,当你处理关键事务像拿掉进程的最后几毫秒时间时,你处理不掉解释型语言的开销。此外,你会想要一个强有力的记忆模型来进行无锁编程,所以你应该看Java、Scala、C++11或Go。
把一切放在内存里
I/O会是延迟主因,所以确保你的所有数据在内存中。这通常意味着管理内存中的数据结构以及维护现有记录,这样你在重启机器或进程后能够重建之前的状态。维持记录的选择包括Bitcask、Krati、LevelDB和BDB-JE。或者你也可以本地运行一个像redis或MongoDB(memory >> data)这样的内存型数据库。但需要注意的是,在它们后台同步数据到硬盘crash时你仍旧可能丢失一些数据。
确保数据和处理程序的位置
网络跳数比磁盘寻道要快,但即使这样通过网络也会增加很多开销。理想情况下,数据应当完全在主机的内存中。像AWS云中几乎提供了1/4TB的内存,物理服务器提供多个TB现在也很常见。如果你需要运行在多个主机上,你应当确保数据和请求被适当的划分,使得在服务请求时所有必要的数据都在本地。
保持系统未充分使用
低延迟总是需要有资源来处理新