DDIA学习笔记5——chapter8:分布式系统的麻烦

DDIA_Chapter8  学习笔记

 

故障与部分失效:

当我们在单机上编写程序时,我们所编写的程序只有两种确定的状态——功能完好or完全失效。

而当我们在分布式系统上编写程序时(例如微服务系统),我们所编写的程序会存在不确定的状态。例如,当服务A调用服务B时,没有响应,可能存在的结果包括:1、服务B失效了  2、服务B没失效,但是存在网络问题,请求没发送至服务B 3、服务B没失效,请求发送到了服务B,但服务B返回的响应丢失了。

 

 

因此,我们在分布式系统上的程序执行结果是不确定的,这种不确定性和部分失效的可能性,使得分布式系统难以工作。如果要使分布式系统工作,就必须接受部分故障的可能性,并在软件中建立容错机制。换句话说,我们需要从不可靠的组件构建一个可靠的系统。

不可靠的网络

不可靠的时钟

进程暂停(JAVA GC——STOP THE WORLD)

 

 

 我们假设每次锁定服务器授予锁或租约时,它还会返回一个防护令牌(fencing token),这个数字在每次授予锁定时都会增加(例如,由锁定服务增加)。然后,我们可以要求客户端每次向存储服务发送写入请求时,都必须包含当前的屏蔽令牌。

​ 在上图中,客户端1以33的令牌获得租约,但随后进入一个长时间的停顿并且租约到期。客户端2以34的令牌(该数字总是增加)获取租约,然后将其写入请求发送到存储服务,包括34的令牌。稍后,客户端1恢复生机并将其写入存储服务,包括其令牌值33.但是,存储服务器会记住它已经处理了一个具有更高令牌编号(34)的写入,因此它会拒绝带有令牌33的请求。

posted on 2020-01-21 17:08  ybonfire  阅读(178)  评论(0)    收藏  举报

导航