【问题标题】:Concept design for a MMO java engineMMO java引擎的概念设计
【发布时间】:2013-12-16 21:59:44
【问题描述】:

我们正在构建一个 HTML5 MMO,它将利用 AJAX 调用对用 Python 编写的 REST API 执行操作(购买、出售、构建、交易、发送、攻击)。

我们这个项目的第二部分是一个 Java 服务器,它每隔一段时间用玩家统计数据更新数据库(我们的服务器滴答是每 5 秒一次,因为性能原因)

Update town SET "currency" = "currency" + "currency_rate"
//each player can own an average of 100 towns and 
//we are benchmarking with 50k for right now

该查询将根据他们的汇率更新他们的货币。这个查询用 50k 更新货币需要 2.6 秒,但我们还有其他几个字段,金属、陶瓷、食品和人口。

问题:使用这种技术,我们只能让服务器至少每 3 秒进行一次滴答。我们如何解决这个问题。您如何不断更新数千个条目?

我们的第二个解决方案:我们将大部分城镇加载到并发哈希图中,java 将使用它作为临时数据库并每分钟更新整个数据库。 (API 将是 Java 服务器)

【问题讨论】:

  • 你想每 3 秒将游戏的整个状态持久化到数据库吗??
  • 这个想法是服务器不断更新玩家的统计数据。我正在寻找一种解决方案,说明如何创建一个处理此类持续更新的服务器。
  • @CrisG 多线程?

标签: java mysql database performance postgresql


【解决方案1】:

n 秒更新整个数据库不是一个好主意。一般而言,RDBMS(尤其是 Postgres)并不是为此类负载而设计的。

尝试仅在需要时更新字段。类似:

  1. 用户想查看黄金数量。
  2. 系统从 DB 获取 last_gold_amountlast_gold_updated
  3. 系统计算current_gold_amount = last_gold_amount + interest_rate * (current_time - last_gold_updated)
  4. 系统将current_gold_amount存储为last_gold_amount并存储last_updated
  5. 向用户显示current_gold_amount

可以对您拥有的任何“货币”执行类似的计算。

另外,第4步只能在用户消费货币或更改利率以进一步降低DB负载时执行。

此外,所有计算都可以隐藏在 Postgres 中的 VIEW 或一组存储过程中,以便您可以通过简单的 SQL 查询获取/修改“货币”的数量。

【讨论】:

  • 在阅读您的回答之前,我们确实决定了您刚才提到的解决方案。虽然它没有解决我们的最后一个问题,人口增长。人口增长是非线性的,我们还没有解决方案。 docs.google.com/drawings/d/…
  • @CrisG 为什么不能使用非线性公式进行此类计算?我无法为你的图表写一个公式,但我相信你可以谷歌或自己写。
  • 我们已经有了方程,但是它是基于时间的(Delta T),所以本质上我们必须在服务器滴答声上运行它(可以是每 5、10 或 30 秒),但它不能随叫随到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2011-04-29
  • 2017-01-13
  • 1970-01-01
  • 2012-01-06
  • 2012-05-25
相关资源
最近更新 更多