英特网运行的如此良好以至于大多数人们觉得它就像大海一样的自然资源,而不是人造物。上一次如此大规模的技术而没有差错有是什么时候呢?
-- Alan Kay
相比于计算机密集型,如今许多应用偏向于数据密集型。对这些应用程序而言,cpu功率很少是一个限制因素,更大的问题通常是庞大复杂的数据,以及这些数据变化的速度。
一个数据密集型应用通常构建于提供所需功能的标准模块,例如,许多应用需要:
• 持久化数据,以便于其或者其他应用能在之后在查找到它 (数据库)
• 记住一些耗时操作的结果,以加快读取(缓存)
• 允许用户按照关键字或者多种过滤方式来搜索数据(搜索索引)
• 发送一条消息到另一个流程,以异步的方式处理(流处理)
• 定期的处理大量的累积数据(批处理)
如果这些听起来很显而易见,那只是因为这些数据系统抽象的非常成功:我们在频繁使用它们的同时却并没有去思考它们。在构建应用程序时,大多数工程师都不希望从头开始编写一个新的数据存储引擎,因为数据库已经是非常好的工具了。
但其实并不是那么简单的。现在很多数据库有不同的特征,因为不同的应用程序需求也不尽相同。同时,缓存也可以有很多种方法,构建搜素引擎等也是如此,有多种实现方式。在构建应用程序时,我们仍然需要确定哪些工具,哪些方法是最适合当前需求的。由此可见,如果一件事仅仅靠单一工具无法实现,而需要把不同的工具组合起来,这还是相当复杂的。
本书主要介绍了关于数据系统原理和实践,以及如何使用它们来构建数据密集型应用。我们将探索不同的工具有什么异同,以及它们是如何实现它们的特性的。
而在这一章中,我们将首先探索我们要实现的基本原理:可靠,可扩展,可维护的数据系统。我们将阐明这些东西的含义,概述一些思考它们的方法,然后回顾一下我们在后面章节所需要的基础知识。在接下来的章节中,我们将一层一层的讨论在处理数据密集型应用时需要考虑的一些设计思路。