<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>数据密集型应用 on LoveIt</title>
		<link>https://hotttao.github.io/tags/%E6%95%B0%E6%8D%AE%E5%AF%86%E9%9B%86%E5%9E%8B%E5%BA%94%E7%94%A8/</link>
		<description>Recent content in 数据密集型应用 on LoveIt</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
			<managingEditor>1556824234@qq.com (宋涛)</managingEditor>
		
		
			<webMaster>1556824234@qq.com (宋涛)</webMaster>
		
		
			<copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright>
		
		
			<lastBuildDate>Fri, 07 Aug 2026 09:53:55 +0800</lastBuildDate>
		
			<atom:link href="https://hotttao.github.io/tags/%E6%95%B0%E6%8D%AE%E5%AF%86%E9%9B%86%E5%9E%8B%E5%BA%94%E7%94%A8/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>13. 软件架构设计中的常见问题</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_101/</link>
				<pubDate>Sun, 14 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_101/</guid>
				<description>&lt;p&gt;哪些常见的软件设计问题&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-消息队列&#34;&gt;1. 消息队列&lt;/h2&gt;&#xA;&lt;h3 id=&#34;11-消息系统的实现方式&#34;&gt;1.1 消息系统的实现方式&lt;/h3&gt;&#xA;&lt;p&gt;消息系统采用发布/订阅模式，为了区分不同的消息系统，提出以下两个问题对区分很有帮助:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;如果生产者发送消息的速度比消费者能处理的快，会发生什么？&#xA;&lt;ul&gt;&#xA;&lt;li&gt;一般有三种选择: 系统丢弃消息；将消息缓存在队列中；激活背压(流量控制，即阻止生产者发送消息)&lt;/li&gt;&#xA;&lt;li&gt;如果消息被缓存在队列中，那么队列增长时会发生什么非常重要&lt;/li&gt;&#xA;&lt;li&gt;如果内存无法容纳所有队列，系统是否会崩溃，还是消息会被写入磁盘&lt;/li&gt;&#xA;&lt;li&gt;如果消息会落盘，又会如何影响消息传递系统的性能&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;如果节点崩溃或者暂时离线，是否会有消息丢失?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;持久化需要写入磁盘或者结合复制方案，这些都是有成本的&lt;/li&gt;&#xA;&lt;li&gt;如果能够接受消息丢失，那么同样的硬件上可以获得更高的吞吐量和更低的延迟&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;消息传递有如下几种方式:&lt;/p&gt;</description>
			</item>
			<item>
				<title>13. 数据系统的未来</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_100/</link>
				<pubDate>Sat, 13 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_100/</guid>
				<description>&lt;p&gt;如何构建现代数据系统&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-构建现代系统&#34;&gt;1. 构建现代系统&lt;/h2&gt;&#xA;&lt;p&gt;前面我们讨论当前流行的技术，接下来我们综合之前所说的所有知识，来谈谈未来的系统应该是什么样子。&lt;/p&gt;&#xA;&lt;h3 id=&#34;11-数据集成&#34;&gt;1.1 数据集成&lt;/h3&gt;&#xA;&lt;p&gt;首先每个软件，即使所谓的通用数据库，也是针对特定的使用模式而设计，第一个挑战就是弄清楚软件产品与他们适合运行环境之间的关系。&lt;/p&gt;</description>
			</item>
			<item>
				<title>12. 流处理系统</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_12/</link>
				<pubDate>Fri, 12 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_12/</guid>
				<description>&lt;p&gt;派生数据&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-流处理系统&#34;&gt;1. 流处理系统&lt;/h2&gt;&#xA;&lt;p&gt;前面讨论的批处理系统存在一个重要的假设: 输入是有界的，是已知的有限大小，所以批处理知道何时读完他们。比如MapReduce 核心的排序操作必须读取整个输入，然后才开始生成输出。&lt;/p&gt;</description>
			</item>
			<item>
				<title>11. 批处理系统</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_11/</link>
				<pubDate>Thu, 11 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_11/</guid>
				<description>&lt;p&gt;派生数据&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-组合的数据系统&#34;&gt;1. 组合的数据系统&lt;/h2&gt;&#xA;&lt;p&gt;前面我们讨论了分布式系统所有主要注意事项，但是这些讨论都只包含一个数据库。事实上数据系统是复杂的，通常需要以多种方式访问和处理数据，并且一个数据库往往无法同时满足所有不同的需求。因此应用程序需要使用若干不同的&lt;strong&gt;数据存储区、索引、高速缓存、分析系统&lt;/strong&gt;等的组合，并实现数据从一个存储系统移动到另一个存储系统。&lt;/p&gt;</description>
			</item>
			<item>
				<title>10. 一致性与共识</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_10/</link>
				<pubDate>Wed, 10 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_10/</guid>
				<description>&lt;p&gt;一致性与共识&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-共识算法的概述&#34;&gt;1. 共识算法的概述&lt;/h2&gt;&#xA;&lt;p&gt;本节我们将讨论构建容错式分布式系统的相关算法和协议。这里我们假设第 8 章中所有的故障都可能发生: 网络会丢失、顺序紊乱、重复发送或延迟；时钟也有一定偏差，节点可能发生暂停甚至随时崩溃。为了构建容错系统，最好先建立一套&lt;strong&gt;通用的抽象机制&lt;/strong&gt;和&lt;strong&gt;与之对应的技术保证&lt;/strong&gt;，这样只需实现一次，其上的各种应用程序都可以安全的信赖底层的保证。这与引入事务是一样的道理。&lt;/p&gt;</description>
			</item>
			<item>
				<title>9. 分布式系统的挑战</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_9/</link>
				<pubDate>Tue, 09 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_9/</guid>
				<description>&lt;p&gt;分布式系统面临的挑战&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-分布式系统中的故障&#34;&gt;1. 分布式系统中的故障&lt;/h2&gt;&#xA;&lt;p&gt;在分布式系统中，故障来自于下面的方方面面:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;网络分区不可避免 &amp;ndash; 网络不可靠&lt;/li&gt;&#xA;&lt;li&gt;时钟和时序问题，时钟无法精确同步  &amp;mdash; 时钟不可靠&lt;/li&gt;&#xA;&lt;li&gt;分布式系统中的一个节点必须假设，执行过程中的任何时刻都可能被暂停相当长一段时间，包括运行在某个函数中间。暂停期间，整个集群其他部分都照常运行，甚至会一致将暂停的节点宣告为故障节点，最终暂停的节点可能会回来继续执行，除非再次检查时钟，否则对刚刚过去的暂停毫无意识&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;让系统容忍失效并不容易，在典型的分布式环境下，没有全局变量，没有共享内存，没有约定的尝试或其他跨节点的共享状态。节点甚至不太清楚现在的准确时间。信息的流动只能通过不可靠的网络来发送。&lt;/p&gt;</description>
			</item>
			<item>
				<title>8. 事务</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_8/</link>
				<pubDate>Mon, 08 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_8/</guid>
				<description>&lt;p&gt;事务&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-为什么需要事务&#34;&gt;1. 为什么需要事务&lt;/h2&gt;&#xA;&lt;p&gt;事务将应用程序的多个读、写操作捆绑在一起成为一个逻辑单元，要么全部成功(提交)、要么失败(中止或回滚)。如果失败，应用程序可以安全地重试。这样无需担心&lt;strong&gt;部分失败&lt;/strong&gt;的情况。事务存在的目的是简化应用层的编程模型。有了事务，应用程序可以不用考虑某些内部潜在的错误以及&lt;strong&gt;复杂的并发性问题&lt;/strong&gt;，这些都交给数据库负责处理(称之为&lt;strong&gt;安全性保证&lt;/strong&gt;)。&lt;/p&gt;</description>
			</item>
			<item>
				<title>7. 分区</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_7/</link>
				<pubDate>Sun, 07 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_7/</guid>
				<description>&lt;p&gt;数据分区&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-分区&#34;&gt;1. 分区&lt;/h2&gt;&#xA;&lt;p&gt;分区的存在为了存储海量数据集或者分摊非常大的查询压力。分区通常是这样定义的，每一条数据(记录)只属于某个特定分区。每个分区都可以视为一个完整的小型数据库。采用数据分区通过将负载分摊到更多的机器上来提高系统的可扩展性。分区和复制通常结合使用，即每个分区在多个节点上都存有副本。&lt;/p&gt;</description>
			</item>
			<item>
				<title>6. 复制</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_6/</link>
				<pubDate>Sat, 06 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_6/</guid>
				<description>&lt;p&gt;系统可扩展性&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-系统的可扩展性&#34;&gt;1. 系统的可扩展性&lt;/h2&gt;&#xA;&lt;p&gt;当负载增加需要更强的处理能力时，我们有两种扩展系统的方式:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;垂直扩展: 购买更强大的机器&lt;/li&gt;&#xA;&lt;li&gt;水平扩展: 组合更多数量的机器&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;垂直扩展通过共享内存和共享磁盘的方式，让操作系统管理更多的 CPU、内存和磁盘，从何获取更强劲的性能。但是这种方式有明显的缺陷:&lt;/p&gt;</description>
			</item>
			<item>
				<title>5. 数据编码与演化</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_5/</link>
				<pubDate>Fri, 05 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_5/</guid>
				<description>&lt;p&gt;构建可适应变化的系统&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-数据的演化&#34;&gt;1. 数据的演化&lt;/h2&gt;&#xA;&lt;p&gt;应用程序不可避免的需要随时间而变化，大多数情况下，应用程序的更改也需要更改其存储的数据: 增删字段或者以新的方式呈现数据。当数据格式或模式发生变化时，同样也需要对应用程序代码进行相应调整。&lt;/p&gt;</description>
			</item>
			<item>
				<title>4. 数据存储和检索</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_4/</link>
				<pubDate>Thu, 04 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_4/</guid>
				<description>&lt;p&gt;数据如何存储，如何检索&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-存储引擎&#34;&gt;1. 存储引擎&lt;/h2&gt;&#xA;&lt;p&gt;上一节我们讨论了&lt;strong&gt;数据模型和查询语言&lt;/strong&gt;，即应用开发人员向数据库执行数据格式并在之后如何查询的机制。接下来我们从数据的角度在此探讨同样的问题，即如何存储输入的数据，并在收到查询请求时，如何重新找到数据。&lt;/p&gt;</description>
			</item>
			<item>
				<title>3. 数据模型与查询语言</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_3/</link>
				<pubDate>Wed, 03 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_3/</guid>
				<description>&lt;p&gt;用于数据存储和查询的通用数据模型&lt;/p&gt;&#xA;&lt;p&gt;&lt;img&#xA;        class=&#34;lazyload&#34;&#xA;        src=&#34;https://hotttao.github.io/svg/loading.min.svg&#34;&#xA;        data-src=&#34;https://hotttao.github.io/images/db/db_start.jpg&#34;&#xA;        data-srcset=&#34;https://hotttao.github.io/images/db/db_start.jpg, https://hotttao.github.io/images/db/db_start.jpg 1.5x, https://hotttao.github.io/images/db/db_start.jpg 2x&#34;&#xA;        data-sizes=&#34;auto&#34;&#xA;        alt=&#34;/images/db/db_start.jpg&#34;&#xA;        title=&#34;big data&#34; /&gt;&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-数据的抽象&#34;&gt;1. 数据的抽象&lt;/h2&gt;&#xA;&lt;p&gt;大多数应用程序是通过一层一层叠加数据模型来构建的，每一层都面临的关键问题是: 如何将其用下一层来表示？例如:&lt;/p&gt;</description>
			</item>
			<item>
				<title>2. 构建怎样的数据系统</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_2/</link>
				<pubDate>Tue, 02 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_2/</guid>
				<description>&lt;p&gt;构建数据密集型应用的目标&lt;/p&gt;&#xA;&lt;p&gt;&lt;img&#xA;        class=&#34;lazyload&#34;&#xA;        src=&#34;https://hotttao.github.io/svg/loading.min.svg&#34;&#xA;        data-src=&#34;https://hotttao.github.io/images/db/%e7%b3%bb%e7%bb%9f%e7%9b%ae%e6%a0%87.png&#34;&#xA;        data-srcset=&#34;https://hotttao.github.io/images/db/%E7%B3%BB%E7%BB%9F%E7%9B%AE%E6%A0%87.png, https://hotttao.github.io/images/db/%e7%b3%bb%e7%bb%9f%e7%9b%ae%e6%a0%87.png 1.5x, https://hotttao.github.io/images/db/%E7%B3%BB%E7%BB%9F%E7%9B%AE%E6%A0%87.png 2x&#34;&#xA;        data-sizes=&#34;auto&#34;&#xA;        alt=&#34;/images/db/%E7%B3%BB%E7%BB%9F%E7%9B%AE%E6%A0%87.png&#34;&#xA;        title=&#34;big data&#34; /&gt;&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-构建怎样的系统&#34;&gt;1. 构建怎样的系统&lt;/h2&gt;&#xA;&lt;p&gt;影响数据系统设计的因素很多，每个因素都需要具体问题具体分析。而我们着重讨论三个在大多数软件系统中都很重要的问题：&lt;/p&gt;</description>
			</item>
			<item>
				<title>1. 构建数据密集型应用</title>
				<link>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_1/</link>
				<pubDate>Mon, 01 Apr 2019 00:00:00 +0000</pubDate><author>1556824234@qq.com (宋涛)</author>
				<guid>https://hotttao.github.io/posts/distributed/design-data-intensive-applications/db_1/</guid>
				<description>&lt;p&gt;《构建数据密集型应用》读书笔记&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;1-写在开始&#34;&gt;1. 写在开始&lt;/h2&gt;&#xA;&lt;p&gt;2014 年我开始自学编程的时候，在各种培训机构的课程里 Mysql 几乎还是唯一的数据库系统。现如今每一个工程师可能都听过 NoSQL，hadoop，Elasticsearch。&amp;ldquo;大数据&amp;quot;已经成为了几乎所有公司看中的技能。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
