在使用操作转换和中央服务器的系统中,多客户端实时协作是如何工作的?

7
我刚刚读完《Jupiter协作系统中的高延迟,低带宽窗口化》,直到第六部分全局一致性,我大部分都理解了。这部分描述了如何将论文中描述的系统扩展以适应连接到服务器的多个客户端。然而,解释非常简短,基本上说系统只要将客户端消息转发给所有其他客户端就可以工作。但是,我不太明白这是如何工作的。发送到所有其他客户端的消息中会发送哪些状态向量?服务器是否为每个客户端维护单独的状态向量?它是否为每个客户端在本地维护小部件的单独副本?
我能想到的一个简单例子是这样的设置: 想象客户端A、服务器和客户端B,客户端A和客户端B都连接到服务器。一开始,三个都有状态对象"ABCD"。然后,客户端A同时向服务器发送消息"在位置0插入字符F",而客户端B发送消息"在位置0插入字符G"。似乎简单地转发客户端A的消息给客户端B,反之亦然,并不能真正处理这种情况。那么服务器究竟做了什么?
1个回答

6
我已经想出了这个如何运作。在我的例子中,服务器为客户端A和客户端B保留状态空间。在服务器首先收到客户端A的消息的情况下,服务器会得到带有状态向量(0,0)的消息,插入F,然后更新其状态向量分别为A和B的(1,0)和(0,1)(其中第一个数字是已处理的来自客户端的消息数,第二个数字是已处理的来自服务器的消息数)。然后服务器使用状态向量(0,0)发送“在位置0处插入F”(因为这是服务器在接收到消息时B状态空间中的状态),并从B以状态(0,0)发送“在位置0处插入G”。由于服务器在B的状态空间中处于(0,1)状态,它首先转换消息(同样地,由于B在接收到服务器的消息时处于(1,0)状态,它也转换了它从服务器收到的消息)。因为变换必须设置为如果xform(c,s)=(c',s'),那么应用于s的c'等于应用于c的s',B和服务器最终处于相同的状态。服务器从B收到的消息并发送给A的消息也是如此。

为了后人,以防这不清楚:服务器充当AB之间的“代理客户端”,将来自Aa)的操作转换为a',并将操作a'转发B(就像服务器本身生成该操作一样)。然后,服务器具有AB操作队列的副本,而AB仅具有服务器操作队列的副本。如需进一步阅读,请查看《组件系统中的并发控制》和《分布式操作变换的反例及点对点通信的修正算法》。 - mzhang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接