协调员的clojure实施

解脱p[状态发件人]println.str.状态“pinged”:名称发件人))))状态

解脱协调[状态]java.lang.thread.睡觉:延迟状态)))Doseq.[听众:听众状态]发送听众p状态)))发送:目标状态协调状态

def代理人{:延迟2500:名称“一种”})))def听众列表代理人“b”代理人“C”))))

发送#(合伙合伙:目标:听众听众)))零?发送协调)))

八卦

闲话方法有很多共同之处圆圈,但刚性较小,较少的保证和更符合节点故障的恢复力。

八卦架构。“></p>
     <p><em>该图始于上面图像中的节点C.</em></p>
     <p>和<em>闲话</em>,当节点接收Ping时,它会在随机上选择另一个节点。为了提高传播速率(如果单个节点下降,则打击故障),节点可以通过每个Ping通知几个其他节点,但必须注意防止每个间隔的平均数量增加。</p>
     <p>这种方法很有用,因为它可以存活节点丢失,而是<em>圆圈</em>无法处理任何节点的丢失,以及<em>协调员</em>很容易受到ping节点的丢失。</p>
     <p>比过于简单更有趣<em>闲话</em>这里建议的机制将是一个组合<em>协调员</em>和<em>闲话</em>。每个节点都会ping另一个随机节点,然后ping自身并睡一段时间。在睡眠时,节点将从还执行相同进程的其他节点接收更新。醒来后它会从其他节点处理ping(实际上,只处理在它安排其ping之前收到的那些引线,在发送Ping之后但在发送后续ping之前,并且执行相同的周期再来一次。</p>
     <p><em>八卦的erlang实施</em></p>
     <div class=

-模块闲话)。-出口([p/1测试/0.])。

p延迟- >收到{p发件人目标}- >IO.格式〜P.收到ping〜P.......〜n[发件人自己()]),计时器睡觉延迟),清单NTH.随机的制服长度目标)),目标!!{p自己(),目标},p延迟结尾

测试()- >PIDS.=清单地图乐趣(_)- >产卵闲话p[1000])结尾清单SEQ.0.10.)),高清PIDS.!!{p自己(),PIDS.}。

八卦的clojure实施

解脱p[状态发件人]println.str.:名称状态“pinged”:名称发件人))))java.lang.thread.睡觉:延迟状态)))发送NTH.:代理人状态兰德 -  int.数数:代理人状态))))p状态状态

def代理人凑钱地图#(代理人{:名称str.“代理人_”:延迟1000}范围0.10.))))

Doseq.[代理人特工]发送代理人#(合伙:代理人代理人))))

零?发送第一的代理人p{:名称“开始”})))

结束思想

可以思考永久移动的异步系统,如参与分布式尾递归的形式。语义可能比循环更复杂,但这些方法的潜力也更有趣。

这y can insulate the perpetual motion against single machine crash, as well as making it possible to have multiple timers running concurrently without requiring custom logic (i.e. finding the soonest timer to fire, sleeping until it fires, reschedule it, find the next soonest timer, and so on).

正如我花更多的时间考虑用心跳考虑分布式系统,我相信我会来欣赏更多关于这里讨论的这些非常简单的方法的更细微的意见,但随时它们似乎在分布式系统设计中似乎是有用的工具。