Geolocation P2P网络中的空间搜索可能吗?
我想建立一个基于Javascript/HTML5地理位置的社交网络,我想知道可能的架构的最佳选择。客户机服务器的开发可能很简单,但缺点是系统资源可能非常高,特别是因为应用程序必须管理移动(最坏的情况是:在车里的用户必须看到他周围的其他用户在车里) 基本上,在客户机-服务器体系结构中,服务器任务将是:Geolocation P2P网络中的空间搜索可能吗?,geolocation,social-networking,geospatial,p2p,Geolocation,Social Networking,Geospatial,P2p,我想建立一个基于Javascript/HTML5地理位置的社交网络,我想知道可能的架构的最佳选择。客户机服务器的开发可能很简单,但缺点是系统资源可能非常高,特别是因为应用程序必须管理移动(最坏的情况是:在车里的用户必须看到他周围的其他用户在车里) 基本上,在客户机-服务器体系结构中,服务器任务将是: 收集并存储用户的纬度和经度(可能有数千个) 对该用户进行地理距离搜索(以获取半径范围内他周围的用户列表) 生成一个XML文件,并将其发送给客户端,其中包含用户在列表中的位置 这3个操作必须定期执行,
Florent您必须拥有中央对等方/服务器,因为您需要集中一些信息才能执行功能 我的观点如下:
调整正方形的大小和“我在这里”消息的速率。就是这样。答案实际上取决于很多事情,因此我将帮助您制定基本策略。要了解情况,您需要了解Kademlia是如何工作的(Kademlia是一个存储信息的DHT P2P网络) 在Kademlia中,每个节点在第一次启动时选择随机ID,这是一个160位的数字,表示所有可能的160位ID空间中的点 通过SHA-1函数获得需要存储的信息的ID(它接收任意字符串,并输出160位数字,该数字被视为需要存储的信息的ID) 在获得信息的ID之后,发布它,该信息将物理存储在一个节点上,该节点的ID接近信息ID (插图摘自) 信息通过其ID进行查询。信息查找或节点查找都需要O(log(N))跳才能获得所需信息。Kademlia中使用了“XOR”度量(在您的例子中,它可以是普通的欧几里德度量) 每个节点维护一个bucket数组,每个bucket包含适合当前bucket的节点地址。适当性是衡量IDs的接近程度的指标。考虑例子:
0 160
Node 1 ID: 1101000101011111101110101001010...
Node 2 ID: 1101011101011111101110101001010...
Node 3 ID: 1101000101011001101110101001010...
对节点#1,2应用异或度量后,即(计算代表这些节点之间虚拟距离的数字),我们得到:
对节点#1,3应用异或度量后,我们得到:
index - 012345678901234
xor - 000000000000011... (the difference is in 13-th msb bit)
order - msb lsb
显然,节点1更接近节点3,因为其有效位的差异小于从节点1到节点2的距离。因此,从节点1的角度来看,它的邻居节点3转到第13个bucket(索引越高意味着ID越近),节点2转到第5个bucket,其中包含一组距离当前节点ID 5 MSB半径的节点
这样的数据结构允许每个节点以160级的距离了解其周围环境
回到您的示例,为了实现高效的地理空间查询,您需要将Kademlias XOR度量替换为普通的欧几里德度量。在这种情况下,您的ID将作为3D或2D向量,不幸的是,由于欧几里得度量结果是浮点数,而浮点数并不直接适用于这种类型的算法,因此您需要以某种方式将它们转换为离散二进制数,类似于XOR函数的作用。之后,查找节点的相邻节点是一项简单的任务
希望这有帮助。哦,顺便说一句,看看HyperDex,这是一种与欧几里得度量密切相关的新的可搜索分布式数据存储,可能会有帮助……我在谷歌上搜索了“空间搜索P2P”,发现了这两项研究(这看起来是非常复杂的空间算法,我将尝试使用基本的客户机/服务器体系结构)。很抱歉批评你,但这是一个典型的实践开发者的快速修复答案,它说“当我可以花时间开发时,我为什么要花时间思考”,不幸的是,这是行业所付出的代价。走这条路,你最终会
index - 012345678901234
xor - 000000000000011... (the difference is in 13-th msb bit)
order - msb lsb