对于erlang游戏玩家服务器来说,membase是一个很好的持久层吗?

时间:2011-10-19 19:11:52

标签: erlang persistence membase erlangweb

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

每栋建筑都有几个模块(发动机,办公室,生产线......)。每个模块将在一个或多个动作中运行,例如使用成分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名球员:)

谢谢

2 个答案:

答案 0 :(得分:2)

我同意Hynek -Pichi- Vychodil。 Riak对于密钥存储来说是件好事。

我们使用Riak几乎95%用于你描述的同样的事情。到目前为止一切都没有任何问题。如果您将达到Riak的性能限制 - 添加更多节点,那就更好了!

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

如果你选择它:

关于membase和内存使用情况:我也试过了membase,但是我发现它不适合我的任务 - (membase声明容错,但我不能以它应该处理错误的方式设置它,即使有帮助来自membase的家伙,我没有成功)。所以目前我使用以下架构:所有在线并玩游戏的玩家都被呈现为玩家进程(gen_server)。每个玩家的所有数据数据和业务逻辑都在其播放器进程中。每个玩家进程都会不时地将其状态保存在riak中。

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

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

答案 1 :(得分:0)

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