如何构建涉及大量地理位置计算的应用程序



我正在尝试创建一个从后端开始的简单社交网络应用。

应用描述

用户打开应用程序将根据其/她/她的地理位置,年龄和性别 显示用户列表

一位用户被查看了一个不会再向他展示。

Technologies

我正在使用Azure cosmosdb(MongoDB实现(和Azure Redis Cache存储文档。

我处理问题的方法

我将所有用户数据库保存在CosmosDB中。我根据地理位置和年龄和性别偏好过滤器查询用户ID,并将结果限制在5000中。

我还应用了一个过滤器,即如果已经查看了用户过滤器。我正在维护每个用户的收藏,他查看的所有用户ID将保存为文档。

我第一次从CosmosDB获得5000 ID,并将4950放入Redis Cache(有到期的时间(。使用剩余的50个ID,我将从COSMOSDB获取用户,并将其作为对API调用的响应返回。对于随后的电话,我从Redis Cache获得下一个50个ID,并获取这些用户并返回作为响应。

问题我正在面对

获取5000用户是一段时间,因为它涉及地理位置计算和其他过滤。我创建了一个示例用户数据库,其中有100英里半径的近200万用户,我应该根据我的喜好获得100,000个用户,即我没有应用5000限制的年龄和性别。这样做大约需要25秒。

应用5000限制最初仅在1-1.5秒内运行查询。当用户被查看时,购买时,当 not-In($ nin(过滤器将排除所需的5000个ID时,最终将增加。从缓存中获得的时间将很快,但是当缓存耗尽或过期时,我们必须点击Cosmos DB来查询5000个用户,随着他已经被视为的用户不断增加,将需要更多时间。

Stats

时间格式为HRS:最小值:秒。它仅用于性能统计数据。实际的API请求每次都会为50个用户提供(大多数时间从缓存(。

首次

获得5000匹配的时间为00:00:01.22

设置查看IDS所花费的时间为00:00:00.06

第二次

获得5000场比赛的时间为00:00:02.49

设置查看IDS所花费的时间为00:00:00.67

::

第十五次

获得5000场比赛的时间为00:00:23.05

设置查看IDS所花费的时间为00:00:09.23

问题

如何改进体系结构以提高性能?Uber,Tinder等应用程序如何涉及用户地理位置计算架构师的应用程序?有没有更好的方法来建模问题或建模数据?

任何帮助将不胜感激。谢谢。

200万用户足够,您需要开始对数据库查询进行良好的索引策略进行工作。地理查询提供了一个独特的索引问题,因为它们是两个相关变量(即经度和纬度(的搜索。

有一个很好的描述,即Microsoft SQL Server如何在此处执行其空间索引,这也很好地总结了索引问题。

尽管我没有亲自使用它,但Cosmodb现在似乎也对此有所支持。请参阅此。

我要做的第一件事是稍微重新考虑您的期望 - 只需找到50或5000(或任何 n (最近的项目,如果那里可能涉及漫长的搜索没有附近的匹配项(或即使有(,但是如果正确索引数据库,则可以在某个点的某些半径 r 中非常有效地搜索,然后按距离对这些结果进行排序。如果您有或期望拥有大量的坐标,我建议这样做几次,换句话说,搜索所有匹配项,以100m的距离,按距离进行排序,然后如果您需要更多,请在500m之内搜索所有匹配项并排除您已经看到的那些,等等,最多可达10公里或25公里,或您的应用要求。

mongoDB具有非常有效的索引,可用于地理空间坐标(基本上是将世界地图划分为B 树(。'$near'查询允许您指定最小值和最大距离,并默认按距离按距离进行分类,因此对于这种基于距离的搜索,它非常方便。但是,如果还没有,则必须将坐标格式化为Geojson Point对象。

最新更新