处理实时位置更新并将其发送给具有可扩展性的附近用户

Handling and emitting of real time location updates to nearby users with scalability

我看到用户提出类似的问题,希望完成类似的事情,但不是这个细节,我希望它能帮助其他走这条路的人。场景如下:我有一个 android 应用程序,其功能之一是向应用程序上的其他用户显示(经许可)用户位置(使用 Google 地图视图)。

我使用 Socket.io 从头开始​​构建了一个套接字服务器。套接字服务器与 RethinkDB 通信以进行实时更新。当客户端发出新位置时,套接字服务器会更新它们在 RethinkDB 上的位置。套接字通过订阅数据库上的更改来获取更新的数据,然后将其发送给套接字上的其他用户 parsing/displaying on their maps.

基本功能运行良好。两个用户可以在地图上实时看到对方。现在是我面临的问题。当您使用 Uber 应用程序时,您只会看到您附近特定范围内的车辆。我想实现类似的目标。我的痛点是确定如何最好地只通知彼此在给定半径内的用户。佛罗里达州的某个人不需要看到加利福尼亚州的某个人,我想如果有很多联系,这将是一个巨大的压力。

  1. 我的第一个想法是:随着每个位置更新的到来,使用地理空间查询向附近的人发送信息。如果有很多连接,这似乎是服务器上的大量处理,而且不实用,因为它会发送给所有用户。

  2. 我的第二个(也是目前正在追求的)想法是使用 Socket.io 房间以某种方式根据用户的位置将用户分开。在这种情况下,我对他们的位置进行反向地理编码以获取地址,并将他们放在服务器上的一个房间中以供他们所在的州使用。这至少缩小了共享房间的用户数量。这确实有效,但它只适用于 U.S。居住在一个州边界的用户可能会错过看到附近的下一个州的用户。还有,一个州还是一个很大的区域。用户只需要看到方圆 20 英里内的其他人。没有必要再进一步。我认为这很有希望,但也有一些缺陷。

  3. 我正在考虑进一步研究的第三个想法是使用某种地理围栏。例如,将一个州划分为多个重叠的地理围栏。每个地理围栏在插座上都有自己的空间。我相信这将是一项艰巨的任务,映射每个围栏,我将不得不决定客户端是否知道它在哪个地理围栏中,或者服务器是否处理该逻辑。最重要的是,除非每个栅栏与其相邻栅栏边缘重叠,否则您不会在附近的下一个栅栏中看到用户。

所以我的问题是:在我深入研究一条路线之前,我想看看是否有更好的选择,或者我是否过度复杂化了这条路线。我做了一些挖掘,看看是否有关于优步如何确定哪些司机离用户很近的信息(可能是地理空间查询?)。他们的解决方案在这种情况下可能无论如何都行不通,因为用户位置可能也在变化,同时仍在接收附近用户的更新,但它是从某个地方开始的。

  1. 不会工作,因为想象有人在州边界的西侧而其他人在边界的另一侧 - 他们彼此相距仅 100 米,但您的应用程序不会将他们放在一个桶中。 3.完全一样的问题。只有 1. 可行,没有其他解决方法。