节点加入与离开网络的机制

在Delta的设计中,每个Delta Node(以下称为节点)都需要加入网络,并在网络上注册自己的身份,这样该节点才能够被网络中的其他节点发现, 并进一步发起任务或参与任务的执行。因此,当节点启动时,第一步就是加入网络。

当节点不再运行时,也需要退出网络,否则用户就无法得知目前网络中有多少节点在线。

在Delta中,节点加入与退出网络,都是通过调用Delta Chain Connector中相应的接口实现的,无论是处于区块链模式还是Coordinator模式。 这两种模式的区别在于,区块链模式下,Delta Chain Connector实际上是调用了链上智能合约的方法,是智能合约实现了节点加入和退出的机制; 而在Coordinator模式下,由Delta Chain Connector自己实现节点的加入和退出。

旧版本机制

在0.8.1版本之前,节点加入的机制如下:

  1. 节点启动时,会加入网络

  2. 节点停止运行时,会退出网络

  3. 为了防止出现两个同名的节点无法区分,两个同名的节点不能同时加入一个网络

在具体实现中,节点加入网络时,智能合约(或Delta Chain Connector)会保留一条该节点的记录;当节点退出时,会删除相应的记录。通过节点的记录来确定在线的节点。

这个设计就造成了一个大家在使用时经常会遇到的问题:节点停止运行后,再次启动就无法加入网络了。这是因为在节点停止时退出网络这一机制并不稳定,可能在调用退出网络方法之前进程就被杀掉了,或者由于网络问题调用失败。这就造成改节点虽然实际上退出了,但是智能合约(或Delta Chain Connector)并不知道,没有删除该节点的记录,一直认为该节点在线,所以会阻止后续同名节点的加入。如果用户在关闭节点之前先关闭了Delta Chain Connector,也会造成同样的问题。

0.8.1版本的新机制

为了解决上述的问题,我们重新设计了整个节点加入网络的机制。新的机制如下:

  1. 节点启动时,会加入网络

  2. 节点停止运行时,会退出网络

  3. 加入网络的节点,会被设置一个存活时间(目前为2分钟)

  4. 节点在存活时间内,会不断地调用相应的方法,刷新其存活时间

  5. 存活时间到期的节点,会被视为退出

  6. 为了防止出现两个同名的节点无法区分,两个同名的节点不能同时加入一个网络

在具体实现中,智能合约(或Delta Chain Connector)不会主动删除存活时间到期的节点。当节点退出时,智能合约(或Delta Chain Connector)只会将该节点的存活时间置为0。当需要判断节点是否在线时(如节点加入、获取节点信息、获取在线节点),通过存活时间来判断节点是否在线。

在新的机制下,节点如果在停止运行时调用了退出网络的方法,再次启动时立刻就能重新加入网络;节点如果在停止运行时没有调用退出网络方法,只要等待存活时间到期(不超过2分钟),就会被视为退出,再次启动时一样可以正常地加入网络。即使Delta Chain Connector先于节点关闭,该机制也不会失效。

最后更新于