2012-06-14 29 views
2

我有一个游戏服务器,它承载了多个游戏实例。玩家可以输入ID加入当前正在运行的游戏。为了将客户与他们想要的游戏实例配对,我有一个ETS表,它将游戏ID映射到处理特定游戏实例的Erlang进程的PID。虽然这有效,但我并不喜欢使用ETS,因为它创建的是不受任何一个进程控制的全局数据。将ID映射到OTP/Erlang中的进程的习惯用法是什么?

我想知道的是:Erlang/OTP中是否有一种惯用的方式将标识符映射到进程?在这种情况下使用ETS ok,因为数据本身就是全球性的?或者我应该有一个存储处理映射的所有ID的字典的进程?我觉得这是更多的Erlang风格,但可能不是性能或并发。我看到其他SO答案时也遇到了gproc,这似乎是一个改进的过程字典。不过,我的印象是,使用过程字典是皱眉(according to the erlang.org web page)。

+0

'gproc'(http://rustyklophaus.com/articles/20090916-GProcErlangGlobalProcessRegistry.html)就好。与内置的过程字典相比,其已知更稳定/改进。你也可以使用'mnesia'内存表,但我认为'ETS'也很好。 –

+1

看看这个问题http://stackoverflow.com/questions/5319553/what-distributed-process-registries-are-available-for-erlang – loxs

回答

6

ETS tables可以通过给定处理/ gen_server被控制,并且其所有权可以从过程被转移期间通过ets:give_away/3或表创建过程中heir option麻烦倍来处理。

许多游戏开发者依赖于像memcached这与ETS没有区别(故意)。但是,mnesia是一个非常稳定的OTP应用程序,与ETS相比,它可以处理更多的并发更新。我们在非常繁忙的应用程序中使用了mnesia,除非整个虚拟机由于其他问题而关闭,否则它一直没有关闭。实际上,在erlang中构建的大多数可用系统都依靠mnesiaETS来共享冗余组件之间的状态,以便在一个故障转移到另一个故障时,内存数据可用。

gproc是一个非常方便的工具,特别是像游戏的东西。这是因为,一个进程取决于它自己的易于访问的数据。没有其他进程可以查找另一个进程的数据。因此,不要在ETS中保持游戏状态,您还可以使用gproc

无论如何,如果你有时间,你可以尝试每个选项,并做一些负载测试,看看哪一个更好。

+2

也不建议在全局模式下运行'gproc'。 – Tilman

+0

是真的,但是:通过负载测试,您会发现'gproc'非常稳定。 –

+0

不确定,在负载测试时,我遇到了gproc中有许多全局注册进程的'gen_leader'崩溃问题。 – Tilman

相关问题