两天里,我游戏服务器都宕机了。然后管理页面也瘫痪了。最后我找到了原因:数据库中有一行缺少了一个标点符号——复制了186次。
发生了什么事呢?对于喜欢听好故事的人来说,我来解释一下。
我用来添加游戏物品的工具里,属性加成值的保存格式出了问题。它不应该是正确的JSON格式,如“力量”:2,带有键的引号,而是像我在代码里写的那样——力量:2,没引号。
这是一个小的差别,但后果却很严重。读取数据的代码无法解析未引用的版本,所以每次游戏载入一个这些物品时,它会静悄悄地放弃,并像物品没有加成一样处理。人们穿着毫无作用的装备,既不知道也没有我知道。
我在两次修复中解决了问题。
第一步,我停止了宕机。每次读取数据库时,我都将其包裹起来,以防止一行坏数据导致整个服务器宕机。这样就结束了2点的醒来。
然后我去解决了实际的问题,因为那些破损的值仍然静悄悄地在那里,默默地使每人的装备失效。我写了一个修复脚本,来找到每个无法解析的值并重写它以正确的格式。
那一部分让我吃惊不小。我只期望修复一个物品,但我发现了六个。然后,因为我决定扫描整个数据库而不是打住,我发现了180个不同的格式问题,之前我甚至不知道。
如果我只修复了那个导致宕机的东西,那么那些现在仍然静悄悄地损坏的行就不会修复了。
我在这个项目上工作时不断地重新学习的一个教训是:当你发现一个数据错误时,假设还有更多的存在并且去数。那些吓着我的错误不是那些会导致服务器宕机的那些,而是那些会静悄悄地失败并返回一个看起来完全合理的数字。
所有186行都已修复并验证。装备再次有效。
我通过辛苦学习了一个教训:一个修复并不是真正完成的,直到问题无法再次出现……我希望。
行者 - 行者的故事
评论 (0)