前言
可供选择的数据库已数以百计。你的应用应该用哪一个?短答案是"看情况"。长答案是——这本书。
不同的数据存储与处理技术做出了不同的取舍,没有哪种方案对所有场景都是最优的。一种系统在某个应用上完美契合,换一个应用就可能完全不适用。本书是一份覆盖整个数据系统版图的指南,重点不在介绍单一产品,而在比较众多系统各自的长处与短处。
数据处理与存储的技术版图虽然多样且变化飞快,底层原理却历久弥新。一旦掌握这些原理,你便能看清每种工具适合何处,懂得如何用好它,又能避开哪些坑。本书聚焦的正是这些原理。
本书既不是某一具体工具的入门教程,也不是堆砌枯燥理论的教科书。我们将考察大量成功的数据系统实例:那些构成众多流行应用之根基、每天都得满足生产环境对可扩展性、性能与可靠性要求的技术。我们将深入这些系统的内部,剖析其关键算法,讨论它们做出的种种取舍。一路上,我们试图寻找有用的方式来思考数据系统——不仅关注它们如何工作,更关注它们为何这样工作。
读完本书后,你将能很好地判断不同种类的技术分别适合何种用途,理解工具如何组合起来,构成一个稳固应用架构的基石。你将培养出一种强烈的直觉,对自己的系统在底层究竟在做什么了然于胸——从而能够推断它们的行为、做出妥当的设计决策,并在问题出现时把它们追查到底。
本书的指导哲学,是把一系列广阔的视角汇集到一起:理论与实践并重,新旧观念兼容。计算行业总是被新潮闪亮的事物所吸引,习惯轻视那些被视为陈旧或过于学院派的东西。这是一种谬误:计算领域许多有力的、奠基性的思想都源自学术研究,有些是新近的,有些则已存在数十年之久。另一方面,学术界有时也并不清楚实践中真正重要的是哪些问题。本书取两者之长:既有学术的精确与对细节的执着,又有产业对实用价值的关切。
谁该读这本书?
如果以下任何一点对你成立,本书都将让你受益:
- 你是一名软件工程师、软件架构师或技术经理,需要为正在打造的系统做出架构决策——例如,需要为某个问题选择工具,并思考如何最好地运用它们。这一点对后端系统尤为适用。
- 你是一名数据工程师,希望理解所处理系统的更宏观背景;或是一名云工程师,想要洞察手中系统的底层原理。你会发现,尽管现代分布式系统对你隐藏了大量复杂度,理解其底层原理对性能优化与调试都极有帮助。
- 你想学会如何让数据系统变得可扩展(譬如支撑数百万用户的应用)、高可用(最大限度减少停机)、运维稳健,且长期易于维护(即便系统在不断成长、需求与技术也在不断变化)。
- 你正准备一场"系统设计"面试——面试中你将被要求勾勒出某个应用的架构,因而需要掌握良好数据架构的原理。
- 你对各大网站、在线服务,以及各类数据库与数据处理系统的幕后好奇——尤其是那种不满足于流行词、想对各项技术及其权衡获得技术上准确而精细理解的好奇。
本书假设你已具备一定的网页应用开发经验,并熟悉关系型数据库与 SQL;对 TCP、HTTP 等常见网络协议有高层次的了解会有帮助。你使用何种编程语言或框架,对本书来说没有差别。
第二版有什么新内容?
本书第二版与 2017 年出版的《Designing Data-Intensive Applications》第一版目标与范围一致。然而,为反映过去十年间的技术变化、并提升讲解的清晰度,我们对全书进行了彻底修订。
自第一版以来,对本书影响最大的两项技术变化,是 AI 引发的兴趣爆发,以及云原生数据系统架构的兴起。本书并不专门讨论 AI,但我们已新增了对支持 AI 与机器学习的数据系统的覆盖,包括向量索引(用于语义搜索)、DataFrame(用于训练数据集),以及为大规模训练数据做准备的批处理系统。云原生的相关思想——例如在对象存储而非本地磁盘之上构建数据系统——也已贯穿全书。
我们还新增了对同步引擎与本地优先软件、工作流引擎与持久执行、形式化方法与随机化测试、GraphQL 以及其他若干值得了解的技术的讨论。我们也补入了一些法律层面的背景,探讨了欧盟《通用数据保护条例》(GDPR)及相关法规的影响。我们同时砍掉了一些内容——例如,鉴于 MapReduce 现今已基本过时,我们相应地重写了批处理一章,并遗憾地决定放弃 Tolkien 风格的地图。
部分讨论被重新组织,章节编号也有所变化。有些章节只做了轻度修订,有些(如关于一致性与共识的第 10 章)则几乎完全重写以求更清晰。整体而言,第二版比第一版多出约 60 页。
参考文献与延伸阅读
本书所讨论的内容,多数已在别处以各种形式被提及——会议演讲、研究论文、博客文章、代码、缺陷追踪器、邮件列表,乃至工程师之间的口耳相传。本书的工作是把这些来源中最重要的思想梳理成体系,并在正文中给出指向原始文献的指引。每章末的参考文献是延伸研究的好资源,其中绝大多数都可以免费在线获取。
在电子书版本中,我们已为线上资源加入了全文链接。由于网络的特性,链接经常失效,我们尽可能也加入了归档链接。如果你遇到失效链接,或者你正在读纸质版,可以借助搜索引擎查找参考文献。对于学术论文,可在 Google Scholar 中搜索标题,找到开源(免费)的 PDF 文件。书可能要花钱,但研究论文不该让你掏腰包。
此外,所有参考文献都可在 https://github.com/ept/ddia2-references 找到,我们会在那里持续更新链接。
本书排版约定
本书采用以下排版约定:
斜体(Italic) :表示新术语、URL、电子邮件地址、文件名与扩展名。
等宽字体(Constant width) :用于程序清单,以及在段落内引用程序元素,如变量或函数名、数据库、数据类型、环境变量、语句与关键字。
等宽粗体(Constant width bold) :表示用户应原样输入的命令或其他文本。
等宽斜体(Constant width italic) :表示应替换为用户提供的值,或由上下文决定的值。
注意:此元素表示一般性提示。
警告:此元素表示警告或注意事项。
O'Reilly 在线学习
四十多年来,O'Reilly Media 始终通过技术与商业培训、知识与洞察服务,帮助企业获得成功。
我们独有的专家与创新者网络,通过书籍、文章和我们的在线学习平台分享其知识与专长。O'Reilly 的在线学习平台为你按需提供直播培训课程、深度学习路径、互动编码环境,以及来自 O'Reilly 与 200 多家其他出版机构的海量文本与视频资源。更多信息请访问 https://oreilly.com。
如何联系我们
请将关于本书的评论与问题寄给出版社:
O'Reilly Media, Inc. 141 Stony Circle, Suite 195 Santa Rosa, CA 95401 800-889-8969(美国或加拿大境内) 707-827-7019(国际或本地) 707-829-0104(传真) support@oreilly.comhttps://oreilly.com/about/contact.html
我们为本书设有专门的网页,列出勘误、示例与任何附加信息,可访问 *https://oreil.ly/DesigningDataIntensiveApps2*。
如需了解我们图书与课程的最新动态,请访问 https://oreilly.com。 在 LinkedIn 关注我们:*https://linkedin.com/company/oreilly*。 在 YouTube 观看:*https://youtube.com/oreillymedia*。
致谢
本书汇集并梳理了大量人士的知识与思想。书中收录了约一千条对文章、博客文章、演讲、文档等内容的引用,我们对所有分享其知识的作者深表感谢。
第二版的写作中,Chris Riccomini 加入 Martin Kleppmann,成为合著者。我们要感谢所有为本书提供反馈与建议、使其得以改进的人——尤其是 David Booth、Mark Callaghan、Chuck Carman、Aniruddh Chaturvedi、William Dealtry、Arbel Deutsch Peled、Phil Eaton、Joy Gao、Johannes Hauser、Matthew Hertz、Erin R. Hoffman、Matt Housley、Karan Johar、Ling Mao、Pedram Navid、Mohit Palriwal、Alex Petrov、Alex Power、Joe Reis、Jack Vanlightly、Will Wilson、Jacky Zhao 与 Zhengliang Zhu。当然,本书中任何残留的错误或不讨喜的观点,责任全部由我们承担。
写作第一版期间,Martin Kleppmann 受惠于一大批不吝惜时间、与他讨论思想或耐心向他讲解概念的朋友。他要感谢 Joe Adler、Ross Anderson、Peter Bailis、Márton Balassi、Alastair Beresford、Mark Callaghan、Mat Clayton、Patrick Collison、Sean Cribbs、Shirshanka Das、Niklas Ekström、Stephan Ewen、Alan Fekete、Gyula Fóra、Camille Fournier、Andres Freund、John Garbutt、Seth Gilbert、Tom Haggett、Pat Helland、Joe Hellerstein、Jakob Homan、Heidi Howard、John Hugg、Julian Hyde、Conrad Irwin、Evan Jones、Flavio Junqueira、Jessica Kerr、Kyle Kingsbury、Jay Kreps、Carl Lerche、Nicolas Liochon、Steve Loughran、Lee Mallabone、Nathan Marz、Caitie McCaffrey、Josie McLellan、Christopher Meiklejohn、Ian Meyers、Neha Narkhede、Neha Narula、Cathy O'Neil、Onora O'Neill、Ludovic Orban、Zoran Perkov、Julia Powles、Chris Riccomini、Henry Robinson、David Rosenthal、Jennifer Rullmann、Matthew Sackman、Martin Scholl、Amit Sela、Gwen Shapira、Greg Spurrier、Sam Stokes、Ben Stopford、Tom Stuart、Diana Vasile、Rahul Vohra、Pete Warden 与 Brett Wooldridge。
还有一些人对第一版书稿提供了宝贵反馈:Raul Agepati、Tyler Akidau、Mattias Andersson、Sasha Baranov、Veena Basavaraj、David Beyer、Jim Brikman、Paul Carey、Raul Castro Fernandez、Joseph Chow、Derek Elkins、Sam Elliott、Alexander Gallego、Mark Grover、Stu Halloway、Heidi Howard、Nicola Kleppmann、Stefan Kruppa、Bjorn Madsen、Sander Mak、Stefan Podkowinski、Phil Potter、Hamid Ramazani、Sam Stokes 与 Ben Summers。
Martin Kleppmann 也感谢他在写作期间获得的资金支持。第一版写作时,LinkedIn 给了他带薪写书的时间,后来他获得了来自 The Boeing Company 的资助。第二版写作期间,他获得了大众基金会颁发的 Freigeist 奖学金,并得到 Ably、Mintter、Prisma 与 SoftwareMill 等众筹支持者的资助,以及来自 ScyllaDB 的赞助。
我们要感谢 O'Reilly 团队让本书得以面世,也感谢同事与家人对我们投入大量时间写作的包容。我们希望你读完之后,会觉得这一切都值得。