
246
|
第
14
章
同步中,模型本身并未指定顺序,只要它提供的顺序对所有成员一致即可,某些实现利
用这一点来提高性能 [BIRMAN10]。
各进程具有相同的组视图,每条消息都关联了一个组标识:只要是同一个组的进程,就
能看到相同的消息。
当参与者加入、离开组或发生故障被迫退出组时,组视图就会改变。组视图的变更会被
通知给所有成员。每个消息都唯一地关联了其发送者所属的组。
虚同步区分消息的
接收
(某一个组成员接收到消息时)和
送达
(所有组成员都接收到消
息时)。如果消息是从某个视图
发送
的,则只能在同一视图中
送达
,这可以通过比较当
前组与消息关联的组来确定。收到的消息在队列中保持等待状态,直到通知该进程消息
已成功送达。
由于每个消息都属于某个特定的组,除非该组中的所有进程都在视图变更之前
接收
到该
消息,否则组成员不能认为此消息已
送达
。这意味着所有消息都是在视图变更
之间
发送
并送达的,这为我们提供了原子传递的保证。这种情况下,组视图变更就像是消息广播
无法通过的屏障。
一些全序广播算法使用定序器(一个负责决定消息顺序的单独进程)对消息进行排序。
这样的算法可能更易于实现,但依赖于对领导者故障的检测以保证活动性。使用定序器
可以提高性能,因为我们无须为每条消息在各进程之间建立共识,而是使用定序器本地
的视图。这种方法也可以通过对请求进行分区来扩展。
尽管技术上很可靠,但虚同步并未被广泛采用,在商业系统中也很罕见 [BIRMAN06]。
14.2.2 Zookeeper
原子广播
原子广播最流行、最广为人知的一个实现是 Apache ...