5

我的目标是创建一个浏览器游戏,玩家可以在其中设置建筑物。

每栋建筑都有几个模块(发动机、办公室、生产线……)。每个模块最终都会运行一个或多个动作,例如使用成分 Y、Z 创建 2OO 个“项目 X”。

游戏服务器将使用 erlang 设置:一个 OTP 应用程序作为服务器本身,氮气作为 Web 前端。我需要数据的持久性。我在考虑以下问题:

当某人或某物与建筑物交互时,或者代表某个生产线的计时器结束时,主管会生成一个 gen_server(如果尚未生成),它从数据库加载建筑物的状态,因此 gen_server 可以回答诸如“添加这个模块','开始这个动作','把这个产品存储到仓库','模具'等(

但是当一个建筑物在 X 秒或几分钟内没有收到任何消息时,他将终止(感谢 gen_server 超时功能)并将其当前状态返回到数据库。

因此,由于它将是一个(软)实时游戏,因此必须非常快速地设置 gen_server。我将 membase 视为数据库,因为众所周知它具有非常好的响应时间。

我的问题是:当一个 gen 服务器启动时,他的状态会填满一些内存,而且这个状态也存在于 membase 处理的内存中,所以这个状态在内存中使用了他的两倍大小。这是一个糟糕的设计吗?

在我的情况下,membase 是处理持久性的好方法吗?使用 mnesia 是一个更好的选择,还是别的什么?

我担心 mnesia 2 Go(或 4?)表大小限制,因为我目前不知道我的 gen_servers 的平均状态大小(本例中的建筑物,还有玩家,生产线等),我可能有一天会超过1 名球员 :)

谢谢

4

2 回答 2

2

我同意 Hynek -Pichi- Vychodil 的观点。Riak 是 key-valye 存储的好东西。

我们几乎 95% 的使用 Riak 来完成您描述的同一件事。到目前为止一切正常,没有任何问题。如果您遇到 Riak 的性能限制 - 添加更多节点,一切顺利!

Riak 的另一个很酷的事情是随着时间的推移它的性能下降非常低。您可以在此处找到有关基准测试 Riak 的更多信息:http: //joyeur.com/2010/10/31/riak-smartmachine-benchmark-the-technical-details/

如果你选择它:

关于 membase 和内存使用:我也尝试过 membase,但我发现它不适合我的任务 - (membase 声明容错,但我无法按照它应该处理故障的方式设置它,即使在 membase 人员的帮助下我没有成功)。所以目前我使用以下架构:所有在线并玩游戏的玩家都呈现为玩家进程(gen_server)。每个玩家的所有数据数据和业务逻辑都在其玩家进程中。有时,每个玩家进程都希望将其状态保存在 riak 中。

到目前为止似乎是非常快速和有效的方法。

更新:现在我们使用 PostgreSQL。太棒了!

于 2011-10-22T10:16:23.543 回答
0

您可以使用bitcask或其他Riak后端来存储您的数据。避免 IPC 绝对是个好主意,所以把它放在 Erlang 里面。

于 2011-10-20T12:04:36.667 回答