【问题标题】:Too many queries? Game server查询太多?游戏服务器
【发布时间】:2016-10-05 01:52:56
【问题描述】:

我正在编写一个游戏服务器(具体来说是一个 SAMP 游戏服务器),我希望改变保存玩家数据的方式。

目前,数据从 MySQL 加载到服务器中的变量中。例如,玩家的钱被加载到名为“Money”的每个玩家变量中(看起来有点像:DATA[playerid][Money])。

如果一个玩家杀死另一个玩家,他们的变量 DATA[playerid][Kills] 会增加。然后,每隔几分钟,当玩家与服务器断开连接时(即他们关闭游戏、游戏崩溃等),MySQL 更新查询就会运行,并将变量中的所有内容存储到“玩家”表中的行中在数据库中。

但是,如果服务器崩溃,数据可能会丢失,即使它只是几分钟的价值(玩家可以在几分钟内赚到可观的钱),所以我正在考虑改变它,而不是不是增加一个变量,它只是增加数据库中的特定字段。例如,如果玩家赚了 100 美元,则更新查询只会将 100 添加到 db 中他们所在行的 money 字段。

显然,这意味着如果有很多玩家在战斗,就会获得大量的杀戮、死亡、金钱和得分,这意味着大量的查询被发送到 MySQL 服务器。这会导致问题,例如减慢速度或导致崩溃吗?确保没有数据丢失是否值得?我从某人那里听说 Twitter 曾经向一台 MySQL 服务器发送数千个查询。

我还记录聊天消息,所以每次玩家发送聊天消息时,都会发送一个查询。如果说每秒有 2-3 条消息,这会导致问题吗?

【问题讨论】:

  • 如果它崩溃,请获得更大的数据库服务器!这里更好的方法可能是将数据放入 Redis 等内存缓存中,然后定期从 Redis 写入 MySQL。
  • 基本上每个在线游戏都会在服务器崩溃时丢失数据。您不必成为唯一的例外(假设它不是真钱)。或者您的服务器是否经常崩溃,这应该是一个问题?是否会导致问题取决于您的服务器规格。然后有办法解决这个问题。但是,您为什么不通过将间隔从“每隔几分钟”经过一些步骤更改为“每秒”来测试您的服务器(以及潜在的解决方法)(我猜您可能想要添加一个更改标记)。您甚至可以将其调整为当前的玩家数量(更多的负载,更高的间隔)。

标签: mysql


【解决方案1】:

我认为您可能需要中间步骤:播放-> 部分保存-> 在数据库中批量保存。
也许这对您的应用程序来说有点矫枉过正,但是您是否尝试过考虑通过数据代理“记录”您的部分信息,like Kafka?如果您有一个生产者(写入数据),kafka 服务器将自动告诉消费者(读取数据)崩溃前的位置。
Or Redis,正如 cmets 中所建议的那样,尽管它甚至可能是更多的是矫枉过正。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多