下面是这本书序言中的大部分内容,本人的英文水平有限,有理解不到位的地方还请大家指教,这算是自己对这本书的读书笔记和总结。

数据是当今系统设计中许多挑战的中心,一些难以解决的问题如系统的可扩展性,一致性,可靠性,有效性和可维护性等需要弄清楚。 另外,我们已经有了各式各样的工具,包括关系型数据库,NoSQL数据库,流处理或批处理以及消息队列,哪一个是你应用程序的最佳选择? 你又如何理解这些流行术语?

在这本实用又全面的指南中,作者Martin Kleppmann通过分析数据处理和存储的各种技术的优缺点,帮助你了解这个多样化的领域。在软件开发中,世界是变化的,但其基本原则保持不变。软件工程师和架构师更应该学习如何在实践中应用这些想法,以及在现代应用中如何充分利用大数据。

概括起来,本书有以下五个方面的特色:

  • 探究你目前正在使用的系统幕后的技术细节,学习如何更有效地使用和操作它们
  • 通过鉴别不同工具的优缺点做出最明智的决策
  • 在一致性,可扩展性,容错性和复杂性之间进行权衡
  • 明白分布式系统技术的研究和实践取决于你所使用的数据库
  • 探究大部分在线服务背后的技术细节,学习他们的架构

作者在开篇就告诉了读者写此书的目的:

技术是推动社会发展的强大力量。 数据,软件和信息可以用来做坏事:巩固不公平的权力结构,破坏人权,保护既得利益。 但是,它们也可以用来做好事:让外界听到底层民众的声音,为每个人创造机会,避免灾难。 这本书正是致力于指引人们人朝着正确的方向前进。

如果你近年来从事软件工程领域的技术开发工作,尤其从事于服务端/后端的开发工作,你的耳朵可能会被大量的有关数据处理和存储的热门术语所充斥:NoSQL! 大数据! 全网域(Web-scale)!分片(Sharding)! 最终一致性(Eventual consistency)! ACID(原子性、一致性、隔离性、持久性)! CAP(一致性、可用性、分区容错性) 理论! 云计算服务(Cloud services)! MapReduce!Real-time!

在过去的十年中我们看到了很多数据库,分布式系统以及在其上构建的应用程序的有趣的发展趋势。这些发展背后有着有不同的推动力:

  • 诸如谷歌,雅虎,亚马逊,Facebook,LinkedIn,微软和Twitter等互联网公司正在处理大量的数据和流量,这样的需求迫使他们创造新的工具使他们能够高效地处理这种大规模的数据
  • 企业的敏捷性,低成本开发,通过缩短开发周期和构建灵活的数据模型能够对不断变化的市场需求做出快速反应
  • 在许多业务中成功的免费开源软件已成为商业或定制的内部软件的首选
  • CPU时钟频率的增长在近年已趋于饱和,但是多核CPU已经成为服务器标配,网络性能不断提升,意味着并行计算能力得到大幅度提升
  • 即使你在一个小规模团队工作,你依然可以借助AWS(Amazon Web Services)这样的基础设施服务(Iaas)在多台计算机甚至多个地理区域上构建分布式系统
  • 现在很多服务都预想是高可靠的,因停电或维修造成的长时间停机越来越不可接受

数据密集型应用正在利用这些技术拓展着无限可能。现在很多应用都是数据密集型的,而不是计算密集型的。因为对这些应用来说,CPU的计算能力不再是瓶颈,更大的挑战来自于数据的数量、复杂度和更新的速度。

帮助数据密集型应用存储和处理数据的工具和技术已经迅速适应这些变化。在新的数据库系统(“NoSQL”)引起业界广泛关注的同时,消息队列,缓存,搜索索引,批处理和流处理框架以及相关技术也同等重要,很多应用综合使用很多种技术。

随处可见的流行语意味着我们热衷于尝试新鲜事物,这是一件好事。 但是,作为软件工程师和架构师,如果我们想要构建出色的应用程序,我们就需要对这些新鲜技术有更加深入精确的理解以及能权衡这些技术的优劣, 为此,我们必须深入挖掘这些新鲜技术背后的细节。

幸运的是,万变不离其宗,在技术快速发展的背后,无论您使用哪个版本的特定工具,都有持久的原则。 如果你了解这些原则,您就能知道每个工具适用的地方,以及如何充分利用它还有如何避免错误。这是本书的目的。

本书的目标是帮助您了解数据处理和存储的日新月异的多样化技术。这不是某个特定工具的专属教程,也不是一本充满干枯理​​论的教科书。相反,我们将会介绍许多数据系统的成功案例:那些运行在生产环境中的支撑起很多流行应用的且每天能够满足伸缩性,性能和可靠性需求的技术。

我们将深入到这些系统的内部,梳理他们的关键算法,讨论他们的原则以及他们面临不同目标时作出的权衡取舍。在这个过程中,我们将尝试寻找探索数据系统的有效方法 - 不仅仅局限于知道它们是如何工作的,还有它们为什么用这种方式工作,以及我们需要问些什么问题。

阅读本书后,您将能够恰当地按需选择合适的技术,并了解如何综合使用多种技术去构建一个健壮的应用程序体系架构。幸运的是很少需要你从头开始构建自己的数据库存储引擎,其实也没有这个必要。然而,你必须能直观的明白你的系统内部正在做什么,这样你就可以推断他们的行为,做出合理有效的设计决策,并且能追踪到可能出现的问题。

谁该阅读这本书?

如果你开发的应用有着存储或处理数据的服务端/后端,并且你的应用使用互联网(例如,Web应用程序,手机app或连接到互联网的传感器),那么这本书适合你。

本书适用于喜欢编程的软件工程师,软件架构师和技术经理。如果您需要对你所开发的系统架构做出决策,例如,如果你需要选择哪些能工具解决给定问题并弄清楚如何最好地应用他们,这也是相当适用的。但即使没有这样的需求,这本书也能帮助你更好地了解他们的优劣。

您应该具有一些开发过Web应用或网络服务的相关经验,并且您应该熟悉关系型数据库和SQL。最好熟悉一些非关系型数据库和其他与数据相关的工具,但不是必须。大致了解常见的网络协议如TCP和HTTP对于本书也是有帮助的。本书与你使用的编程语言或平台无关。

如果你符合下面列出的任何一种情况,这就是一本很有价值的书:

  • 您想了解如何使数据系统可扩展,例如,为数百万用户支持Web或移动应用。
  • 您需要提高应用的可用性(最大限度地减少停机时间)和运行稳定性。
  • 您正在寻找使系统长期易于维护的方法,即使随着系统不断发展即使需求和技术的不断变化。
  • 您对事物的运行机制有着天然的好奇心,并且希望知道大部分网站和在线服务背后的原理。本书分析了各种数据库和数据处理系统的内部结构,探索这些系统设计中的亮点是非常有趣的事情。

有时,我们在讨论可扩展的数据系统时,有些人会作出“你不是谷歌或亚马逊”这样的评论。"停止担心规模,只使用关系型数据库“这个陈述中有这样的道理:为不需要的规模构建系统是浪费精力,这也有可能会把你锁在僵化的设计中。 实际上,这是一种过早优化的形式「过早优化是万恶之源」。但是选择合适的工具也很重要,每个技术都有各自不同的优点和缺点。 我们将会看到关系型数据库固然很重要但他不是对数据处理技术的盖棺定论。

本书范围

本书没有打算给出关于如何安装或如何使用专用软件包或API的详细说明,因为这些内容已经有很多文档了。 相反,我们会讨论对数据系统至关重要的各种原则和权衡,我们也会探索不同的产品所做出的不同的设计决策。

在本书的电子版中,我们包含了在线资源的全文链接。所有链接都在出版时都进行了验证,但不幸的是,由于网络自身的性质,有些链接存在频繁中断的现象,如果您遇到这种情况或者您阅读的是本书的印刷本,你可以借助搜索引擎查找这些参考资料。对于学术论文,您可以在Google学术搜索中搜索相关标题以查找开放取阅(open-access)式的PDF文件。 或者,您可以在https://github.com/ept/ddia-references找到所有的参考资料,我们会在这里维护最新的链接。

我们主要关注数据系统的架构以及它们被集成到数据密集型应用中的方式。由于篇幅的原因这本书不涉及部署,操作,安全,管理等领域 - 这些都是复杂而重要的话题以致于在本书中用一些片面的粗略的注解都不足以给与他们正确的评价,他们中的任一个亦能单独出一本书。

本书中描述的许多技术属于大数据领域。 然而,“大数据”这个术语被过度使用且定义很模糊。 本书使用更为明确的术语,如单节点VS分布式系统,在线/交互式VS离线/批处理系统。

本书偏向于自由和开源软件(FOSS),因为阅读,修改和执行源代码是一种理解事情是如何工作的有效方式。使用开放平台还可以降低供应商锁定的风险。 然而,在适当的情况下,我们也讨论所有权软件(闭源软件,软件即服务,或仅在文献中描述但不公开发布的公司内部软件)。

本书纲要

本书分为三部分:

  1. 在第一部分中,我们会讨论数据密集型应用设计的基本思想。我们将从第1章开始讨论我们要努力实现的功能:可靠性,可扩展性和可维护性;我们该如何考虑这些功能以及如何实现它们。在第2章中,我们将比较几种不同的数据模型和查询语言,看看它们是如何适应不同情况的。在第3章中,我们将讨论存储引擎:数据库如何在磁盘上存储数据以便我们可以再次快速地找到它。第四章将转向介绍数据编码(序列化)的格式和架构演变的历程。
  2. 在第二部分中,我们将单节点数据存储转移到分布式数据存储。这通常对于实现可扩展性的应用来说是必需的,但同时也会带来各种各样的挑战。我们将先讨论复制(第5章),分区/分片(第6章)和事务(第7章)。然后,我们再更详细地讨论分布式系统中存在的问题(第8章),以及在分布式系统中实现consistency和consensus意味着什么(第9章)。
  3. 在第三部分中,我们将讨论数据抽取、转换、装载的过程。源数据通常存储在异构系统中:当没有一个数据库可以把所有事情都能处理好的时候,应用程序就该需要集成几个不同的数据库,缓存,索引等等。在第10章中,我们将用批处理的方法进行数据转换,而在第11章中我们将用流处理的方法来进行数据转换。最后,在第12章中,我们将所有内容放在一起,讨论在未来构建可靠的,可扩展的、可维护的应用程序的方法。

参考文献及延伸阅读

我们在本书中讨论的大部分内容已经在其他地方以某种形式被提及了----会议报告,研究论文,博客文章,代码,bug追踪器,邮件列表。 这本书总结了来自许多不同来源的最重要的想法,其中包括了这本书所有的原始文献的出处。如果你想更深入地探索每一个知识细节,那么每章末尾的参考资料都是很好的资源,他们中的大多数可以在线免费获取。

作者:鱼果
本文地址:http://www.cnblogs.com/fingerling/p/8297696.html
欢迎转载,请在明显位置给出出处及链接。

Designing Data-Intensive Applications的更多相关文章

  1. 【C#】Send data between applications

    This sample shows how to send data between different applications, including object data——transform ...

  2. BATJTMD,大厂招聘,都招什么样Java程序员?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 Java学到什么程度可以找工作? 最近总看到类似这样的问题,也有一些工作3年左右的小 ...

  3. UDT: Breaking the Data Transfer Bottleneck

    http://udt.sourceforge.net/ DT is a reliable UDP based application level data transport protocol for ...

  4. MapReduce: 一个巨大的倒退

    前言 databasecolumn 的数据库大牛们(其中包括PostgreSQL的最初伯克利领导:Michael Stonebraker)最近写了一篇评论当前如日中天的MapReduce 技术的文章, ...

  5. Redis的LRU算法

    Redis的LRU算法 LRU算法背后的的思想在计算机科学中无处不在,它与程序的"局部性原理"很相似.在生产环境中,虽然有Redis内存使用告警,但是了解一下Redis的缓存使用策 ...

  6. Toward Scalable Systems for Big Data Analytics: A Technology Tutorial (I - III)

    ABSTRACT Recent technological advancement have led to a deluge of data from distinctive domains (e.g ...

  7. Awesome Big Data List

    https://github.com/onurakpolat/awesome-bigdata A curated list of awesome big data frameworks, resour ...

  8. HDFS relaxes a few POSIX requirements to enable streaming access to file system data

    https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html Introduction [ ...

  9. Moving Computation is Cheaper than Moving Data

    https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html Introduction The Hadoop Distributed File Syst ...

  10. Cloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications 云设计模式:云应用的规范架构指导

    1.Cache-aside Pattern 缓存模式 Load data on demand into a cache from a data store. This pattern can impr ...

随机推荐

  1. python 使用paramiko模块上传本地文件到ssh

    我们要了解几个函数: paramiko.Tranport(("目标ip,端口"))#这是上传目标的IP和端口 paramiko.SFTPClient.from_tranport() ...

  2. Shortest path of the king

    必须要抄袭一下这个代码 The king is left alone on the chessboard. In spite of this loneliness, he doesn't lose h ...

  3. UEP-时间的比较

    时间的比较: var rec = ajaxform.getRecord(); var sd = rec.get("startDate"); var ed = rec.get(&qu ...

  4. Java数据结构和算法(十二)——2-3-4树

    通过前面的介绍,我们知道在二叉树中,每个节点只有一个数据项,最多有两个子节点.如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树.本篇博客我们将介绍的——2-3-4树,它是一种多叉树,它的每 ...

  5. 从零开始学习前端JAVASCRIPT — 1、JavaScript基础

    1:定义:javascript是一种弱类型.动态类型.解释型的脚本语言. 弱类型:类型检查不严格,偏向于容忍隐式类型转换. 强类型:类型检查严格,偏向于不容忍隐式类型转换. 动态类型:运行的时候执行类 ...

  6. css background之设置图片为背景技巧

    css background之设置图片为背景技巧-css 背景 Background是什么意思,翻译过来有背景意思.同样在css里面作为css属性一成员同样是有背景意思,并且是设置背景图片.背景颜色. ...

  7. win7、win10进程pid4占用80端口的解决办法

    https://jingyan.baidu.com/article/7e4409533ffe092fc1e2ef10.html 今天想用wamp架设服务器,但是程序启动不起来,查看系统端口,80端口被 ...

  8. HTTP 405 错误 – 方法不被允许 (Method not allowed)【转载】

    介绍 HTTP 协议定义一些方法,以指明为获取客户端(如您的浏览器或我们的 CheckUpDown 机器人)所指定的具体网址资源而需要在 Web 服务器上执行的动作.则这些方法如下: OPTIONS( ...

  9. 请问:关于织梦dedecms点击导航上的父栏目进去默认显示第一个子栏目的列表的问题

    要设置织梦dedecms点击导航上的父栏目进去默认显示第一个子栏目的列表, 就按照如下图所示的方法进行操作,为什么 点击导航上的父栏目出现死循环呢, 根本浏览不了网页. 请各位大神指点指点,为什么点击 ...

  10. MySql Outer Join 简单化

    查询from语句中的Outer Join可以在多种情况下被简化: 在解析阶段,右外连接操作可以被转变为等下ode值包含left join的操作,在一般情况下,转变: (T1, ...) RIGHT J ...