敞开成长之旅!这是我参加「日新方案 2 月更文应战」的第 25 天,点击检查活动概况

1 一个简略分布式算法

1.1 需求处理的问题:

    1,高速网络 与 推迟缓慢的网络, 需求 保证所有进程 运用相同的频率 与高速网络通信。
    2,假如当时运用的频率呈现问题,需求切换频率。

1.2 问题特色:

    1,信息是幂等的,
            假如高速网络切换到不同的频率,新的频率不依赖于旧的频率。
            承受新频率的进程 可 只更新频率。而不管旧频率是否更新。
    2,信息量小
            可用在小数据包中轻松跨节点传达。 例如 频率可用编码为 64位的整数。

1.3 处理思路:

算法的基本思想是 跨进程 存在人工时间 概念,
用于对事情或信息进行排序,而无需求助于进程的 体系时间,这在它们之间很难同步。
这个人工时间误差称为 “纪元”。 每个进程都有 currentEpoch的概念,即在启动时 初始化 为0
每当一个进程看到一个大于 其当时 epoch 的 epoch时,它就会更新它的 epoch 以匹配观察到 epoch。
每个进程也有 frequencyEpoch概念,即当时运用的频率的版本。
每个进程定期向其他进程发送更新音讯。 以传达信息。例如,每5秒每个进程挑选一个随机进程,并向它发送一个更新音讯,其间包括:当时运用频率,运用频率的纪元 以及发送 更新音讯的进程 currentEpoch
第一次创建进程时,其频率设置为 -1 , 这表示 从给定进程的视点看,当时没有运用频率,有必要挑选另一个频率。

1.4 更新操作:

    当一个进程接纳到 来自另一个进程的更新音讯,其间包括一个 频率 Epoch 大于其本地 frequencyEpoch的频率,它将其频率更新为接纳值,并将 frequencyEpoch设置为 接纳值

    当currentEpoch 或 frequency 和 frequencyEpoch被修改时,进程将此改动写入磁盘或其他永久存储,以便进程从头启动时 运用最新的已知信息。

1.5 挑选频率

	一个流程需求在 两种不同的场景挑选频率
		1,检测到当时 频率有噪声
		2,当时频率设置为 -1 时(启动时)

1.6 作业原理

1, 进程增加自己的 currentEpoch,并将其写入永久存储。还挑选 适宜的新频率。
2, 该进程向所有其他进程 发送一个 ELECT_ME 数据包以取得其他进程的投票。ELECT_ME数据包包括 发送进程的 currentEpoch
3, 只有当它们的 currentEpoch 与恳求投票的进程之一比较不大时,其他进程才回复YOU_HAVE_MY_VOTE 数据包(包括投票进程 currentEpoch)。
接纳ELECT_ME数据包将导致更新旧的 currentEpoch匹配传入的数据包之一。	
4,给定进程在 给定的 epoch内只 投票一次,所有它需求一个名为 lastVoteEpoch的变量。
只有在投票恳求中 currentEpoch大于 lastVoreEpoch时 才会供给它的投票。当投票被供给时,lastVoteEpoch 被更新。(投票前存储在 磁盘,这样溃散和重启不会导致 再次投票)。
5,YOU_HAVE_MY_VOTE 音讯的currentEpoch小于恳求投票进程的currentEpoch将被丢掉。
6,假如进程被选中,它将更新它的 frequencyEpoch和频率变量,将运用的 grequencyEpoch是 进程恳求投票的 纪元,即它发送 ELECT_ME数据包时currentEpoch,就在增量之后。
一个进程需求被推举 来改动频率,并且每个进程在给定的 epoch中投票一次,在给定的epoch中有必要只有一个获胜者。
假如给定的进程无法取得大多数未达成的进程,则会在随机推迟之后再试一次。
与用于交流这些音讯的慢速网络推迟比较,此推迟有必要更大。 每个进程都会在小于重试的一段时间后 认为推举中止。

1.7 新信息的 传达

当一个进程 赢得推举时,它将其频率值和频率更新为新的,因此经过发送更新音讯,终究所有其他进程都将取得更新,并切换到新频率。
假如某进程被分区, 它将在 分区回复后立即收到更新。
但是一旦进程改动频率,就尽快向所有进程广播UPDATE音讯 是一个好主意,这样所有其他节点将尽快切换。

1.8 算法改善

经过增加 frepuencyEpoch 值来改善 ELECT_ME 数据包,这样假如进程有 陈腐的信息,其他进程将回绝投票。
例如,这或许产生在进程被分割一段时间的旧频率时,该频率由于噪声太多而无法正常作业。 
大多数 进程 已经切换到 新的频率。
当分区恢复时,进程或许会被 推举 并在 有时机接纳 更新的频率之前 将频率更改为其他频率,然后导致无用的频率切换。 
经过在 ELECT_ME 数据包增加 grequencyEpoch并让其他进程供给投票之前检测信息是否更新,可用避免无用的切换。

小结:

仅在当时频率 的确 嘈杂时 才供给投票。
这避免了在高带宽无线电中 呈现硬件问题的单个节点将能够接连切换到 新频率。
由于每个频率都会被检测为 有噪声,这样只有当大多数节点检测到当时频率有问题时,才产生频率切换。

敞开成长之旅!这是我参加「日新方案 2 月更文应战」的第 25 天,点击检查活动概况