Geolocation P2P网络中的空间搜索可能吗?

Geolocation P2P网络中的空间搜索可能吗?,geolocation,social-networking,geospatial,p2p,Geolocation,Social Networking,Geospatial,P2p,我想建立一个基于Javascript/HTML5地理位置的社交网络,我想知道可能的架构的最佳选择。客户机服务器的开发可能很简单,但缺点是系统资源可能非常高,特别是因为应用程序必须管理移动(最坏的情况是:在车里的用户必须看到他周围的其他用户在车里) 基本上,在客户机-服务器体系结构中,服务器任务将是: 收集并存储用户的纬度和经度(可能有数千个) 对该用户进行地理距离搜索(以获取半径范围内他周围的用户列表) 生成一个XML文件,并将其发送给客户端,其中包含用户在列表中的位置 这3个操作必须定期执行,

我想建立一个基于Javascript/HTML5地理位置的社交网络,我想知道可能的架构的最佳选择。客户机服务器的开发可能很简单,但缺点是系统资源可能非常高,特别是因为应用程序必须管理移动(最坏的情况是:在车里的用户必须看到他周围的其他用户在车里)

基本上,在客户机-服务器体系结构中,服务器任务将是:

  • 收集并存储用户的纬度和经度(可能有数千个)
  • 对该用户进行地理距离搜索(以获取半径范围内他周围的用户列表)
  • 生成一个XML文件,并将其发送给客户端,其中包含用户在列表中的位置
  • 这3个操作必须定期执行,每3或5秒一次,因为我需要一个“实时”地图,显示列表中的用户在其环境(城市、城镇)中移动

    这三点都可以优化:

  • 客户在移动10米时发送其位置,以减少要处理的数据量
  • 在MyISAM表中使用空间索引进行“球形矩形”搜索(使用MBRContains)以卸载MySQL数据库
  • 公共输出文件:如果两个用户位于x米半径内(两个用户彼此靠近),则发送的XML可能相同
  • 在这个阶段很难进行负载估计,但我认为客户机-服务器体系结构不适合这种类型的应用程序,如果两个客户机可以在彼此靠近时通信,peer2peer可能是一个很好的答案

    我的观点是:

    有没有什么方法可以让客户端在没有中央服务器帮助的情况下盲搜索位于某个半径内的其他客户端?(可以使用UDP广播:-)

    编辑:更正。UDP Brodcast允许客户机在特定范围或IP地址内轮询任何位置的计算机

    谢谢你的帮助,
    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