DDIA_Chapter8 学习笔记
当我们在单机上编写程序时,我们所编写的程序只有两种确定的状态——功能完好or完全失效。
而当我们在分布式系统上编写程序时(例如微服务系统),我们所编写的程序会存在不确定的状态。例如,当服务A调用服务B时,没有响应,可能存在的结果包括:1、服务B失效了 2、服务B没失效,但是存在网络问题,请求没发送至服务B 3、服务B没失效,请求发送到了服务B,但服务B返回的响应丢失了。
因此,我们在分布式系统上的程序执行结果是不确定的,这种不确定性和部分失效的可能性,使得分布式系统难以工作。如果要使分布式系统工作,就必须接受部分故障的可能性,并在软件中建立容错机制。换句话说,我们需要从不可靠的组件构建一个可靠的系统。
我们假设每次锁定服务器授予锁或租约时,它还会返回一个防护令牌(fencing token),这个数字在每次授予锁定时都会增加(例如,由锁定服务增加)。然后,我们可以要求客户端每次向存储服务发送写入请求时,都必须包含当前的屏蔽令牌。
? 在上图中,客户端1以33的令牌获得租约,但随后进入一个长时间的停顿并且租约到期。客户端2以34的令牌(该数字总是增加)获取租约,然后将其写入请求发送到存储服务,包括34的令牌。稍后,客户端1恢复生机并将其写入存储服务,包括其令牌值33.但是,存储服务器会记住它已经处理了一个具有更高令牌编号(34)的写入,因此它会拒绝带有令牌33的请求。
原文:https://www.cnblogs.com/ybonfire/p/12222430.html