没有一成不变的系统需求,想法和目标在不断变化:适配新外部环境,新用例,业务优先级变化,用户要求新功能,新平台取代旧平台,法律或监管要求变化,业务增长促使架构演变等。

组织、流程方面 ,敏捷开发模式为适应变化提供了很好参考。敏捷社区还发布了很多技术工具和模式,以帮助在频繁变化的环境中开发软件,例如TDD和重构。这些敏捷开发技术多数还只是针对小规模、本地模式(例如同一应用程序中的几个源代码文件)环境。我们需要探索在更大的数据系统层面上提高敏捷性,系统由多个不同特性的应用或者服务协作而成

我们的目标是可以轻松修改数据系统,使其适应不断变化的需求,这和简单性与抽象性密切相关:简单易懂的系统往往比复杂系统更易修改。我们将采用另一个不同的词指代数据系统级的敏捷性:可演化性。

6 总结

本文探讨了一些关于数据密集型应用的基本原则。

一个应用必须完成预期的多种需求,主要包括:

  • 功能性需求(即应该做什么,比如各种存储、检索、搜索和处理数据)
  • 非功能性需求( 常规特性、例如安全性 、可靠性、合规性、可伸缩 、兼容性和可维护性)

本文重点梳理讨论了可靠性、可扩展性和可维性:

  • 可靠性,意味着即使发生故障,系统也能正常工作。故障包括硬件(通常随机,不相关)、软件(缺陷通常是系统的,更难处理)及人为(总是很难避免时不时出错)方面。容错技术可很好隐藏某种类型故障,避免影响最终用户。
  • 可扩展性,负载增加时,有效保持系统性能的相关技术策略。 先探讨了如何定量描述负载和性能。简单地以推特浏览时间线为例描述负载,并将响应时间百分位数作为衡量性能的有效方式。对于可扩展的系统,增加处理能力的同时,还能在高负载情况下持续保持系统的高可靠性。
  • 可维护性,意味着许多方面,但本质是为让工程和运维团队更轻松。良好抽象能帮助降低复杂性, 使系统更易于修改和适配新场景。良好的可操作性意味着对系统健康状况有良好的可观测性和有效的管理方法。

知易行难,使应用程序可靠、可扩展或可维护很不容易。