我想知道对于典型的MMORPG来说,nosql选项可以替代rdbms,或者与rdbms结合使用会有什么好处。特别是,我很好奇在nosql下是如何保持数据完整性的。
我将举几个我对服务器逻辑如何操作感到困惑的例子:
场景1:假设A和B同时攻击C。无论哪个玩家杀死了玩家C,都会更新player_stats.kill_count。通常情况下,可以通过以下方式处理这个AttackPlayerRequest:
开始事务{ attacker.health = newAttackerHealth
defender.health = newDefenderHealth
如果defender.Health == 0{ attacker.stats.kills += 1}}
场景2:玩家A将一件物品卖给NPC供应商,然后迅速尝试将同一物品从他们的库存中扔到地上。(即使你的UI不允许这样做,他们也可以直接把事件放到网络上)。
这个列表显然还在继续,并影响着几乎每个玩家-世界的互动。最后一条信息是服务器是线程化的,因为我们不想要任何特别冗长的请求来阻止其他玩家在游戏中做简单的事情。
我想我这里最大的问题是,我是不是误解了nosql,这是一个微不足道的问题?如果不是,这是否超出了nosql选项要解决的范围?在典型的MMO中,可以在何处注入nosql选项来提高服务器性能?
发布于 2013-01-13 08:17:40
这完全取决于你的游戏是如何运行的。
NoSQL
facebook上的Farmville使用NoSQL。Farmville就像一个巨大的服务器,每个人都在上面。假设Farmville在其数据库集群中使用3台计算机。圣地亚哥的1号计算机。纽约的2号计算机。莫斯科的3号计算机。我从圣地亚哥登录到Facebook,所以我在这里连接到数据库。我升级并注销。最终,计算机1会告诉计算机2和3我是如何升级的,但俄罗斯人可能需要一个小时才能看到我账户的这些变化。
NoSQL scaling非常简单,只需将另一台计算机添加到集群中,并告诉该区域中的网站使用该计算机。
SQL
有几种方法可以使SQL工作,但我将解释一种使其类似于NoSQL的方法。
每个数据中心将有10个游戏服务器,每个服务器都有自己的SQL数据库+1个子主数据库。子主数据库在所有10个服务器之间共享信息,因此如果您登录到服务器1并使角色John Doe,然后注销,服务器10将具有您的角色,如果您下一次登录到该服务器。
然后,Sub Master与您总部的Master Server共享其信息。然后,主服务器会将John Doe共享给所有其他数据中心的其他子主服务器,这些子主服务器将更新它们的游戏服务器。此配置将允许您登录到旧金山的服务器杂草,扮演您的角色,注销,登录到莫斯科的伏特加服务器,仍然可以看到您的角色。
像魔兽世界这样的游戏使用SQL,但只有数据库的某些部分是共享的。这可以减少每台计算机上的数据库大小,还可以减少硬件要求。
在现实生活中,每个Sub Master都会有一个备份Sub Master,而您的Master服务器会有几个备份服务器,以防其中一台服务器宕机,整个网络不会被锁定。
发布于 2010-12-11 05:33:20
我认为MMO服务器会做很多你在内存中列出的事情。我不认为他们会把所有的数据都放到数据库里。我认为更多的硬设置事件,如接收新的齿轮或改变你的齿轮布局将被保存。
这是大量的数据,但并不像每一次战斗互动那样多。
发布于 2015-09-16 22:29:38
担心延迟的MMORPG通常在单个服务器上运行,并将除对象模型信息以外的所有内容都存储在RAM中。任何与战斗环境相关的东西都会担心延迟。
任何使用硬盘的东西,无论是关系型数据库还是NoSQL,在战斗环境中都不是一个好主意。更新和共享对象自定义、位置、移动向量、方向向量、健康、能力等。如果你担心延迟,那么通过任何使用HHD的机制在一台服务器上的10,000个用户之间的数据是愚蠢的。即使你有两个人在一个简单的竞技场上打架,延迟仍然是一个问题,你应该在一台服务器上运行,并将所有东西都保存在内存中。所有要渲染的东西都应该在你的PC上,或者也在你的PC的内存中。
不担心延迟的MMORPG可以在多个服务器和任何您想要的数据库(NoSQL、MySQL等)上运行。
如果你正在制作像farmville或neopets这样的游戏,那么是的,NoSQL或MySQL是有效的选择。
https://stackoverflow.com/questions/4413483
复制相似问题