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

标签 mysql mongodb rest scalability achievements

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

我目前的想法是在 MongoDB 中拥有一个成就集合以及一个玩家集合。我会将成就列表存储在成就集合中(该列表可以修改以添加新成就并将用作成就定义),并且它将包含统计数据和阈值列表(完成成就的目标),而玩家集合将包含由玩家 ID 以及每个成就的字典(作为键)和许多统计数据(进度)作为值以及信息(完成或未完成)组成的对象。

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

我的问题是,我需要该服务在高压下工作(数十万玩家大量发送新统计数据(例如击杀数,也许是数千个统计数据和数千个成就)),而我目前的想法似乎是这样对数据库的调用太多。

我想过改用 MySQL 数据库,但我不太擅长使用它们,所以我不确定这样是否会更好( View 可以加快速度吗?)。对于大型数据库来说,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”方法,而不是单独执行此步骤,而是加入下一步。总之,我们可以减少一次数据库之旅

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

这可能是第一次去数据库

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.

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

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 并创建一个处理逻辑的过程。

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

关于mysql - 几乎实时的 RESTful 成就可扩展的 Web 服务,如何减少调用次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43638072/

相关文章:

mysql - 使用变量和 while 存在的情况下迭代 mysql select 语句

java - JSP中IF语句执行错误

scala - 在 GET 请求期间使用 Akka HTTP 指令的字符串参数

rest - 如何使用 REST API 使用 Google Ads API v0 获取经过身份验证的用户的 Google 广告帐户 ID?

java - Spring Boot @ManyToMany 未显示在 JSON 中

mysql - 如何将其归一化为 1NF/2NF?

java - 在android中使用mysql、json将数据插入在线服务器。

node.js - 一旦保存在 Mongoose 中,如何使某些字段不可更新?

mongodb - 在 mongodb 副本集中添加辅助实例时出错

php - 将关系型与非关系型混合(MySQL 和 MongoDB)