Skynet 基础结构设计

之前说了自己的关于p2p应用容器的想法,这两天就按照这个思路进行了具体的设计。这个想法很令我着迷,我给它起了一个很酷的名字—— skynet。设计中也发现了一些比较有趣的问题,在这里写一写。

app的基础肯定包含文件操作,比如创建文件,修改文件,读取文件。这些操作都涉及到了一个问题,就是数据同步的问题。同一个app的某个实例创建了一个文件,别的实例如何知道这个文件被创建了。同样文件被某个实例修改了,怎么保证其他的app读到的是正确的文件。而这些问题中包含了一个更底层的问题。p2p网络节点之间的通信怎么办? 这里的通信指的是节点之间的连接方式,也就是信息的传播路径。既然是p2p为什么不是直接传递呢,还要路径做什么?假设节点个数有上万个,那么某个节点要向其他节点发送信息,比如告诉其他节点我创建了一个文件,就要直接连接上万个节点。这显然是低效的。但是假如这个节点先告诉周围的十个节点,然后同时这十个节点又向其周围的节点继续扩散。从传播速度上这显然是更高效。所以研究节点的通信结构是很有必要的。

最简单直接的方式就是 所有节点随机连接,每个节点只和随机的几个节点固定连接。

很明显这样会存在很多问题。首先可能某两个节点之间是无法联通的。 其次可能会出现重复通信的情况。因为传播路径不止一个。再次这个结构具有不稳定性。对于p2p网络,节点是非常不稳定的,在任意时刻节点都有可能下线。而一旦节点下线产生的影响就很难估量了。

从这个简单的例子也分析出我们要找的节点的通信结构至少要包含以下的几个特点。
1. 收到消息的节点会向其他节点传播消息
2. 同一节点不能重复接受消息
3. 节点具有不稳定性,即使节点挂掉也要保证系统整体的稳定性。

有一个常见的结构很好的满足了以上各点,那就是层级结构。



假设最左下角的那个节点创建了一个文件,它要把这个信息告诉网络中的所有其他节点。首先它告诉自己的父节点,父节点同时告诉自己的子节点和自己的父节点。传到第一级节点后就是指数级的传播, 很快就能传播到全部节点。这个方法同样也没有消息重复的问题,可以保证所有节点接受且仅接收到一次消息。由于这个结构有如此明显的优势,所以人类社会,其他动物种群也都是自然而然的形成了这种层级结构。

但是这个由一个明显的缺陷,节点的不稳定性会对网络产生比较大的影响。越高等级的节点如果挂掉,产生的影响就会越大。然而自然的进化已经给了我们答案。当种群中的领导者挂掉之后就会产生新的领导者去接替其职位。同样,高等级的节点挂掉之后可以找到其优秀的子节点代替其位置。同时在给节点进行评级的时候就要选择那些比较可靠,连接速度又快的节点作为高等级节点。

然而这样还是有些问题。所有的消息都是传播到全部节点的。


假设1号节点只想和3号节点进行通信。慢着会有这种情况吗?当然会有,假如只有1号节点和3号节点运行着名叫Hello world的应用。 那么关于这个应用的通信就和其他节点无关。但是现在1和3之间还隔着2,4,5这三个节点。明明他们是可以直接进行连接的。如果这之间的流量很大,对于整个网络都是一个很大的负担。
所以很有必要进行优化。方法也很简单。根据app相关性来构造节点连接。只有运行着同样的app 实例的节点才会形成层级结构。所以一个节点的连接信息应该是如下的形式

#在这里输入代码(从下一行开始,不要删除我...)

[
 {
    'app': 'app1-uuid',
    'father': 'father-uuid',
    'child': ['child-uuid1', 'chid-uuid2', 'child-uuid3']
 },

 {
    'app': 'app2-uuid',
    'father': 'father-uuid',
    'child': ['child-uuid1', 'chid-uuid2', 'child-uuid3']
 },

 {
    'app': 'app3-uuid',
    'father': 'father-uuid',
    'child': ['child-uuid1', 'chid-uuid2', 'child-uuid3']
 },
]

基本的结构完成了,那么怎么让所有的节点自发的形成这种结构呢?这样就又遇到了下面的比较核心的问题。
1. 节点的评级问题 。
2. 节点的连接算法,如何决定某两个节点间是否建立连接。
这些我还没有想明白,然而已经大致上有了个思路。可以利用类似于数学归纳法的方法。

当只有两个节点时,只能两个节点直接连接,
当有三个节点时, 只能三个串在一起,但是谁在中间已经会产生不同。
当有四个节点时,就会有更复杂的结构。就这样总结出n个节点时的特性。然后考虑第n+1个节点如何连接才能保证系统效率。

还有一种思路,就是默认新节点都是在最末支的节点中。如果表现超过其父节点就让其升级。这个更接近于现实中的情况,可能也会更高效。
标签上篇: p2p 应用? 次篇: 关于复数