几乎实时 RESTful 可扩展的 Web 服务成就,如何减少调用次数?

Almost Real Time RESTful Achievements Web Service that Scales, How can I reduce the number of calls?

我正在构建实时成就网络服务。

我目前的想法是在 MongoDB 和玩家 collection 中取得成就 collection。我会将成就列表存储在成就 collection 中(可以修改该列表以添加新成就并将作为成就定义)并且它将包含统计数据和阈值列表(完成成就的目标) ,而玩家 collection 将有 objects 由 playerID 组成,每个成就的字典作为键,许多统计数据(进度)作为值,以及信息(完成与否) .

当客户 post 新统计数据时,我会获取成就列表,并通过获取成就 collection 找到那些在他们的进度中使用这些统计数据的人。然后我需要获取玩家 collection 以查找哪些成就已经完成并将它们从我当前的成就列表中删除以进行处理。然后我会再次获取玩家 collection 以获取其他统计数据并计算新进度。我需要更新玩家 collection 的成就进度。如果成就完成,我会向客户端发送回调,以便它可以看到它 "live"。

我的问题是我需要服务在高压下工作(成千上万的玩家发送大量新统计数据(比如击杀数,可能有数千个统计数据和数千个成就)),我目前的想法似乎对数据库进行太多调用。

我考虑改用 MySQL 数据库,但我对它们不是很好,所以我不确定那样做是否会更好(视图可以加快速度吗?)。 Redis 对于大型数据库来说似乎成本太高了。

我应该改用更好的流程/设计模式吗?

有没有一种方法可以使模式在重负载下仍然很快?

我应该改用 MySQL 吗?如果是,帮助我加快速度的关键因素是什么? (所以我可以阅读它并设计出更好的东西)

我从没用过NoSQL,但经常用SQL。所以我的想法可能有偏见或过于 SQL 中心。

话虽如此,这是我的想法。总的来说,我认为每个新统计数据需要两次数据库调用。

When a client would post new stats, I would get the list of achievements and find those that use those stats in their progression by fetching the achievements collection.

如果成就集合足够小,您可以在服务初始化时缓存到内存中。 如果没有,我认为您应该采用 "MySQL" 方法,不要单独执行此步骤,而是加入下一步。总之,我们可以减少一次去 DB

的行程

Then I would need to fetch the players collection to find which achievements are already completed

这可能是第一次去 DB

remove those from my current list of achievements to process

我相信这与数据库无关,而是程序内部的逻辑。但是,如果我错了,请纠正我。

Then I would fetch the players collection again to get the other stats and compute the new progress.

我认为您可以从第一次 DB 旅行中获取此信息并将其保存在内存中的某个位置。所以不需要进一步的数据库旅行

I would need to update the progress of the achievement on the players collection.

这将是您第二次更新数据库。

If an achievement is complete, I would send a callback to the client, so it can see it "live".

与DB无关

如果这仍然是太多的数据库调用,而您只想进行一次,我唯一的想法是切换 MySQL 并创建一个处理逻辑的过程。

通过这种方式,您将只为每个统计数据建立一个数据库联系,这是不可避免的,并将所有负载推送到数据库层,以便在那里扩展。