P1124 租约机制

租约机制

题目描述

鸽鸽用一台土豆机器搭建了自己的博客,一开始只有几百人访问,一台土豆机器的单机系统工作非常流畅。现在有几百万人访问,一台土豆机器无法满足性能需求,给用户的体验很差。鸽鸽准备用多台土豆机器搭建一个分布式土豆系统来提高性能。

不同的用户实际访问的机器是不同的,但是效果必须得是相同。鸽鸽搭建系统时,面临的第一个问题就是,某台机器修改数据后,如何让所有的机器也获取到最新数据。一个朴素的想法,每台机器都存储一份完整的数据,任意一台机器更新数据时都将最新的数据广播给其他机器,让所有机器同时更新。但是这个办法很难保证所有机器都同时更新数据。可能第一台机器更新了数据,第二台机器还没来得及更新数据,在这期间有两个用户分别通过第一台和第二台机器来访问该数据。在这种场景中,两个用户得到的数据就会不一样,一个是新数据,一个是旧数据,这就造成了数据不一致。同时这种方法需要广播数据,性能也较低。鸽鸽想了想,决定只让一台机器作为中心节点可以更新数据,其他机器作为辅助节点可以访问但是无法更新数据。

鸽鸽的这个分布式系统中,有一个中心节点,存储、维护数据。系统中的其他节点通过访问中心节点读取、修改其上的数据。除了中心节点,其他节点初始化是没有数据的。当用户访问到某个节点,请求读取数据时,如果它没有数据就会从中心节点读取数据,然后返回给用户。如果每次用户访问数据,都要从中心节点读取数据,性能比单机系统还差。所以从中心节点获取数据的同时,会获取一个租约时间,如果当前时间不超过(不大于)租约,就将租约和数据都保存下来。下次用户访问时,如果当前时间没有超过租约(租约没到期),就直接返回数据;否则,先清空现有数据,再从中心节点读取数据。聪明的你,肯定想问,如果租约没到期直接返回数据,这个时候中心节点已经更新了数据,不也会出现数据不一致吗?你能想到这个问题,鸽鸽也能想到。所以中心节点在所有节点租约到期前,不会更新数据。中心节点会阻塞所有更新请求,将这些更新请求都按时间顺序保存下来,等所有租约全部到期后(大于最晚租约的最小时间),再一一更新。聪明的你,肯定又想问,那如果一直有其他节点从中心节点获取更晚的租约,那不是会一直无法更新数据?你能想到这个问题,鸽鸽也能想到。所以中心节点在处理完所有更新数据请求前,发送给任何节点的租约只会是当前已有的最晚租约,不会更晚。当用户访问某个节点,请求更新数据时,它会把这个请求转发给中心节点。因为只有中心节点才能更新数据,其他节点只是缓存中心节点的数据。鸽鸽给自己的这个方法取了个名字,叫租约协议。

🔒
登录后查看完整题面
登录后查看题目

统计