diff --git a/ch8.md b/ch8.md index 9947c3f..7d6520d 100644 --- a/ch8.md +++ b/ch8.md @@ -216,11 +216,11 @@ ​ 为什么数据中心网络和互联网使用分组交换?答案是,它们针对**突发流量(bursty traffic)**进行了优化。一个电路适用于音频或视频通话,在通话期间需要每秒传送相当数量的比特。另一方面,请求网页,发送电子邮件或传输文件没有任何特定的带宽要求——我们只是希望它尽快完成。 -​ 如果你想通过电路传输文件,你将不得不猜测一个带宽分配。如果您猜的太低,传输速度会不必要的太慢,导致网络容量闲置。如果你猜的太高,电路就无法建立(因为如果无法保证其带宽分配,网络不能建立电路)。因此,使用用于突发数据传输的电路浪费网络容量,并且使传输不必要地缓慢。相比之下,TCP动态调整数据传输速率以适应可用的网络容量。 +​ 如果想通过电路传输文件,你得预测一个带宽分配。如果你猜的太低,传输速度会不必要的太慢,导致网络容量闲置。如果你猜的太高,电路就无法建立(因为如果无法保证其带宽分配,网络不能建立电路)。因此,使用用于突发数据传输的电路浪费网络容量,并且使传输不必要地缓慢。相比之下,TCP动态调整数据传输速率以适应可用的网络容量。 ​ 已经有一些尝试去建立支持电路交换和分组交换的混合网络,比如ATM[^iii] InfiniBand有一些相似之处【35】:它在链路层实现了端到端的流量控制,从而减少了在网络中排队,尽管它仍然可能因链路拥塞而受到延迟【36】。通过仔细使用**服务质量(quality of service,)**(QoS,数据包的优先级和调度)和**准入控制(admission control)**(限速发送器),可以仿真分组网络上的电路交换,或提供统计上的**有限延迟**【25,32】。 -[^iii]: **异步传输模式(Asynchronous TransferMode, ATM)**在20世纪80年代是以太网的竞争对手【32】,但在电话网核心交换机之外并没有得到太多的采用。与自动柜员机(也称为自动取款机)无关,尽管共用一个缩写词。或许,在一些平行的世界里,互联网是基于像ATM这样的东西,因为互联网视频通话可能比我们的更可靠,因为它们不会遭受丢包和延迟的包裹。 +[^iii]: **异步传输模式(Asynchronous TransferMode, ATM)**在20世纪80年代是以太网的竞争对手【32】,但在电话网核心交换机之外并没有得到太多的采用。与自动柜员机(也称为自动取款机)无关,尽管共用一个缩写词。或许,在一些平行的世界里,互联网是基于像ATM这样的东西,因此它们的互联网视频通话可能比我们的更可靠,因为它们不会遭受丢包和延迟的包裹。 ​ 但是,目前在多租户数据中心和公共云或通过互联网[^iv]进行通信时,此类服务质量尚未启用。当前部署的技术不允许我们对网络的延迟或可靠性作出任何保证:我们必须假设网络拥塞,排队和无限的延迟总是会发生。因此,超时时间没有“正确”的值——它需要通过实验来确定。 @@ -271,7 +271,7 @@ [^v]: 虽然时钟被称为实时时钟,但它与实时操作系统无关,如第298页上的“[响应时间保证](#响应时间保证)”中所述。 -​ 时钟通常与NTP同步,这意味着来自一台机器的时间戳(理想情况下)意味着与另一台机器上的时间戳相同。但是如下节所述,时钟也具有各种各样的奇特之处。特别是,如果本地时钟在NTP服务器之前太远,则它可能会被强制重置,看上去好像跳回了先前的时间点。这些跳跃以及他们经常忽略闰秒的事实,使时钟不能用于测量经过时间【38】。 +​ 时钟通常与NTP同步,这意味着来自一台机器的时间戳(理想情况下)与另一台机器上的时间戳相同。但是如下节所述,时钟也具有各种各样的奇特之处。特别是,如果本地时钟在NTP服务器之前太远,则它可能会被强制重置,看上去好像跳回了先前的时间点。这些跳跃以及他们经常忽略闰秒的事实,使时钟不能用于测量经过时间【38】。 ​ 时钟还具有相当粗略的分辨率,例如,在较早的Windows系统上以10毫秒为单位前进【39】。在最近的系统中这已经不是一个问题了。 @@ -385,13 +385,13 @@ while(true){ request=getIncomingRequest(); // 确保租约还剩下至少10秒 - if (lease.expiryTimeMillis-System.currentTimeMillis()< 10000){ + if (lease.expiryTimeMillis-System.currentTimeMillis() < 10000){ lease = lease.renew(); } if(lease.isValid()){ process(request); - }} + } } ``` @@ -485,7 +485,7 @@ while(true){ ​ 如果一个节点继续表现为**天选者**,即使大多数节点已经声明它已经死了,则在考虑不周的系统中可能会导致问题。这样的节点能以自己赋予的权能向其他节点发送消息,如果其他节点相信,整个系统可能会做一些不正确的事情。 -​ 例如,[图8-4](img/fig8-4.png)显示了由于不正确的锁实现导致的数据损坏错误。 (这个错误不仅仅是理论上的:HBase曾经有这个问题【74,75】)假设你要确保一个存储服务中的文件一次只能被一个客户访问,因为如果多个客户试图写对此,该文件将被损坏。您尝试通过在访问文件之前要求客户端从锁定服务获取租约来实现此目的。 +​ 例如,[图8-4](img/fig8-4.png)显示了由于不正确的锁实现导致的数据损坏错误。 (这个错误不仅仅是理论上的:HBase曾经有这个问题【74,75】)假设你要确保一个存储服务中的文件一次只能被一个客户访问,因为如果多个客户试图对此写入,该文件将被损坏。您尝试通过在访问文件之前要求客户端从锁定服务获取租约来实现此目的。 ![](img/fig8-4.png) @@ -503,7 +503,7 @@ while(true){ ​ 我们假设每次锁定服务器授予锁或租约时,它还会返回一个**防护令牌(fencing token)**,这个数字在每次授予锁定时都会增加(例如,由锁定服务增加)。然后,我们可以要求客户端每次向存储服务发送写入请求时,都必须包含当前的防护令牌。 -​ 在[图8-5](img/fig8-5.png)中,客户端1以33的令牌获得租约,但随后进入一个长时间的停顿并且租约到期。客户端2以34的令牌(该数字总是增加)获取租约,然后将其写入请求发送到存储服务,包括34的令牌。稍后,客户端1恢复生机并将其写入存储服务,包括其令牌值33.但是,存储服务器会记住它已经处理了一个具有更高令牌编号(34)的写入,因此它会拒绝带有令牌33的请求。 +​ 在[图8-5](img/fig8-5.png)中,客户端1以33的令牌获得租约,但随后进入一个长时间的停顿并且租约到期。客户端2以34的令牌(该数字总是增加)获取租约,然后将其写入请求发送到存储服务,包括34的令牌。稍后,客户端1恢复生机并将其写入存储服务,包括其令牌值33。但是,存储服务器会记住它已经处理了一个具有更高令牌编号(34)的写入,因此它会拒绝带有令牌33的请求。 ​ 如果将ZooKeeper用作锁定服务,则可将事务标识`zxid`或节点版本`cversion`用作防护令牌。由于它们保证单调递增,因此它们具有所需的属性【74】。 diff --git a/ch9.md b/ch9.md index 31be9a9..7a1637f 100644 --- a/ch9.md +++ b/ch9.md @@ -301,7 +301,7 @@ ​ 这种行为的原因是每个CPU核都有自己的内存缓存和存储缓冲区。默认情况下,内存访问首先走缓存,任何变更会异步写入主存。因为缓存访问比主存要快得多【45】,所以这个特性对于现代CPU的良好性能表现至关重要。但是现在就有几个数据副本(一个在主存中,也许还有几个在不同缓存中的其他副本),而且这些副本是异步更新的,所以就失去了线性一致性。 -​ 为什么要做这个权衡?对多核内存一致性模型而言,CAP定理是没有意义的:在同一台计算机中,我们通常假定通 信都是可靠的。并且我们并不指望一个CPU核能在脱离计算机其他部分的条件下继续正常工作。牺牲线性一致性的原因是**性能(performance)**,而不是容错。 +​ 为什么要做这个权衡?对多核内存一致性模型而言,CAP定理是没有意义的:在同一台计算机中,我们通常假定通信都是可靠的。并且我们并不指望一个CPU核能在脱离计算机其他部分的条件下继续正常工作。牺牲线性一致性的原因是**性能(performance)**,而不是容错。 ​ 许多分布式数据库也是如此:它们是**为了提高性能**而选择了牺牲线性一致性,而不是为了容错【46】。线性一致的速度很慢——这始终是事实,而不仅仅是网络故障期间。 diff --git a/colophon.md b/colophon.md index f0149bb..bbe2e31 100644 --- a/colophon.md +++ b/colophon.md @@ -24,7 +24,7 @@ Alibaba+-Finplus 架构师/全栈工程师 (2015 ~ 2017) 《设计数据密集型应用》封面上的动物是**印度野猪(Sus scrofa cristatus)**,它是在印度、缅甸、尼泊尔、斯里兰卡和泰国发现的一种野猪的亚种。与欧洲野猪不同,它们有更高的背部鬃毛,没有体表绒毛,以及更大更直的头骨。 -印度的野猪有一头灰色或黑色的头发,脊背上有短而硬的毛。雄性有突出的犬齿(称为T),用来与对手战斗或抵御掠食者。雄性比雌性大,这些物种平均肩高33-35英寸,体重200-300磅。他们的天敌包括熊、老虎和各种大型猫科动物。 +印度野猪有一头灰色或黑色的头发,脊背上有短而硬的毛。雄性有突出的犬齿(称为T),用来与对手战斗或抵御掠食者。雄性比雌性大,这些物种平均肩高33-35英寸,体重200-300磅。他们的天敌包括熊、老虎和各种大型猫科动物。 这些动物夜行且杂食——它们吃各种各样的东西,包括根、昆虫、腐肉、坚果、浆果和小动物。野猪经常因为破坏农作物的根被人们所熟知,他们造成大量的破坏,并被农民所敌视。他们每天需要摄入4,000 ~ 4,500卡路里的能量。野猪有发达的嗅觉,这有助于寻找地下植物和挖掘动物。然而,它们的视力很差。