有同学问到:线性一致性的保证要从那个层面来理解,是系统提供的,还是客户端看到的?如果仅仅是系统提供的,但客户端还是有可能看到非线性一致,那好像并没有简化应用层的编程模型?
举个例子:
初始 x = 0
- 客户端 A 发出写请求 [t = 0 | t = 5, x = 1| t = 6]。含义是 t = 0 时刻发出请求,t = 5 时刻服务端生效,t = 6 请求返回。
- 客户端 B 有两个线程
- 线程 1 发出读请求 [t=1 | t = 6 | t = 7],读到 x = 1;
- 线程 2 发出读请求 [t= 3 | t =4 | t = 10],读到 x = 0;
这样虽然系统保证线性一致性,但是从客户端的视角来看,由于网络延迟的不确定性,仍然是先发出的请求看到了旧的值。
我想了想,还是简化了编程模型的。
上述例子两个请求是没有依赖关系,而且是并发的,所以确实可能出现先看到了新值又看到了旧值。但这种因果的倒置是因为有我们这个绝对客观的上帝视角。
如果仅是从编程角度,是不能通过时间先后来判断多个渠道拿到的结果的因果。想要维持因果,则:
- 只使用一个通道。比如是只使用一个线程来请求并设置 x 的值。
- 让多个通道显式同步。比如只有一个线程拿到结果后,才让另外线程发出请求。
如果系统本身就不提供线性一致的话,我们仅用一个通道都会拿到不符合因果的结果。