我有一个游戏服务器,可以托管多个游戏实例。玩家可以输入ID以加入当前正在运行的游戏。为了将客户端与他们想要的游戏实例配对,我有一个ETS表,它将游戏ID映射到处理该特定游戏实例的Erlang进程的PID。虽然这有效,但我真的不喜欢使用ETS,因为它会创建不受任何一个进程控制的全局数据。
我想知道的是:在Erlang / OTP中是否存在将标识符映射到进程的惯用方法?在这种情况下使用ETS是否正常,因为数据本质上是全局的?或者我应该有一个进程存储所有ID的字典来处理映射?我觉得这是更多的Erlang风格,但可能不是高性能或并发。在查看其他SO答案时,我也遇到gproc,这似乎是一个改进的流程词典。但是,我的印象是,使用流程字典是不受欢迎的(according to the erlang.org web page)。
答案 0 :(得分:6)
ETS tables
可以由给定的进程/ gen_server控制,并且在创建表时,可以通过 ets:give_away/3
或 heir option
在故障期间将其所有权从进程转移到进程。
许多游戏开发者依赖memcached
之类的东西,与ETS
没有区别(故意)。但是,mnesia
是一个非常稳定的OTP应用程序,与ETS
相比可以处理更多的并发更新。我们在非常繁忙的应用程序中使用了mnesia,它从未停止过,除非整个VM由于其他问题而关闭。实际上,在erlang中构建的大多数可用系统都依赖于mnesia
或ETS
来共享冗余组件之间的状态,以便当一个故障转移到另一个时,内存中的数据可用。 br /> gproc
是一个非常方便的工具,尤其适用于Gaming等游戏。这是因为,一个过程取决于它自己易于访问的数据。没有其他进程可以查找其他进程的数据。因此,您可以使用ETS
,而不是将游戏状态保留在gproc
中。
无论如何,如果你有时间,你可以尝试每个选项并进行一些负载测试,看看哪一个表现更好。