节点加入与离开网络的机制
在Delta的设计中,每个Delta Node(以下称为节点)都需要加入网络,并在网络上注册自己的身份,这样该节点才能够被网络中的其他节点发现, 并进一步发起任务或参与任务的执行。因此,当节点启动时,第一步就是加入网络。
当节点不再运行时,也需要退出网络,否则用户就无法得知目前网络中有多少节点在线。
在Delta中,节点加入与退出网络,都是通过调用Delta Chain Connector中相应的接口实现的,无论是处于区块链模式还是Coordinator模式。 这两种模式的区别在于,区块链模式下,Delta Chain Connector实际上是调用了链上智能合约的方法,是智能合约实现了节点加入和退出的机制; 而在Coordinator模式下,由Delta Chain Connector自己实现节点的加入和退出。
旧版本机制
在0.8.1版本之前,节点加入的机制如下:
节点启动时,会加入网络
节点停止运行时,会退出网络
为了防止出现两个同名的节点无法区分,两个同名的节点不能同时加入一个网络
在具体实现中,节点加入网络时,智能合约(或Delta Chain Connector)会保留一条该节点的记录;当节点退出时,会删除相应的记录。通过节点的记录来确定在线的节点。
这个设计就造成了一个大家在使用时经常会遇到的问题:节点停止运行后,再次启动就无法加入网络了。这是因为在节点停止时退出网络这一机制并不稳定,可能在调用退出网络方法之前进程就被杀掉了,或者由于网络问题调用失败。这就造成改节点虽然实际上退出了,但是智能合约(或Delta Chain Connector)并不知道,没有删除该节点的记录,一直认为该节点在线,所以会阻止后续同名节点的加入。如果用户在关闭节点之前先关闭了Delta Chain Connector,也会造成同样的问题。
0.8.1版本的新机制
为了解决上述的问题,我们重新设计了整个节点加入网络的机制。新的机制如下:
节点启动时,会加入网络
节点停止运行时,会退出网络
加入网络的节点,会被设置一个存活时间(目前为2分钟)
节点在存活时间内,会不断地调用相应的方法,刷新其存活时间
存活时间到期的节点,会被视为退出
为了防止出现两个同名的节点无法区分,两个同名的节点不能同时加入一个网络
在具体实现中,智能合约(或Delta Chain Connector)不会主动删除存活时间到期的节点。当节点退出时,智能合约(或Delta Chain Connector)只会将该节点的存活时间置为0。当需要判断节点是否在线时(如节点加入、获取节点信息、获取在线节点),通过存活时间来判断节点是否在线。
在新的机制下,节点如果在停止运行时调用了退出网络的方法,再次启动时立刻就能重新加入网络;节点如果在停止运行时没有调用退出网络方法,只要等待存活时间到期(不超过2分钟),就会被视为退出,再次启动时一样可以正常地加入网络。即使Delta Chain Connector先于节点关闭,该机制也不会失效。
最后更新于