0

我构建了一个社交 android 应用程序,用户可以在其中通过 gps 位置查看周围的其他用户。一开始一切顺利,因为我的用户数量很少,但是现在我的用户数量越来越多(每天大约 1500 +100),我发现了我的设计中的一个主要问题。

在我的 Google App Engine servlet 中,我有一个静态 HashMap,它保存了所有用户配置文件对象,当前为 1500,并且随着更多用户注册,这个数字会增加。

为什么我这样做

每个请求他周围用户的用户都会将他的 gps 与其他用户进行比较,并检查他们是否在他的 10 公里半径范围内,平均每 5 分钟发生一次。这就是为什么我每次都无法从 db 获取用户的原因,因为 GAE 读/写操作配额会让我分崩离析。

这个设计的问题是

随着用户数量的增加,Hashmap 每隔 4-6 小时就会变为 null,我认为这个时间会越来越短,但我不确定。每次我检测到它变为空时,我都会通过从数据库重新加载用户来解决这个问题,但这会导致我的用户出现 DOS 30 秒,所以我正在寻找更好的解决方案。
我猜这是因为哈希图的大小,对吗?

我想知道如何管理所有具有最大可用性的用户配置文件。

谢谢。

4

2 回答 2

1

我不会将这些数据存储在 HashMap 中,因为如果您在多个实例上运行它并不能真正扩展,而且您会使用大量内存。

你为什么不使用一些不同的存储,比如也可以在“云”中使用的 MongoDB?(例如 www.mongohq.com)。

如果您想扩展,则需要将数据与处理器分开。例如,让 x 个服务器运行您的 servlet(或让 Google AppEngine 自行扩展)并将数据放在不同的位置(例如,在 MongoDB 或 PostgreSQL 中)。

于 2012-09-30T10:40:29.487 回答
0

你需要重新考虑你的整个设计。将所有用户存储在一个巨大的空间HashMap中不会扩展(迟早你将不得不集群你的应用程序)。此外,您的算法的复杂性非常高 - 您需要为每个用户遍历整个地图。

一个更具可扩展性的解决方案是使用空间数据库。所有主要的关系数据库和一些 NoSQL 产品都提供地理空间索引。基本上,数据库查询引擎针对以下查询进行了优化:给我这个给定点附近的所有记录

如果您的应用程序真的成功,那么即使是内存中的地图也会比企业级地理空间索引慢。

于 2012-09-30T10:44:14.950 回答