Architecture 在OTP/Erlang中,将ID映射到进程的惯用方法是什么?

Architecture 在OTP/Erlang中,将ID映射到进程的惯用方法是什么?,architecture,erlang,otp,Architecture,Erlang,Otp,我有一个游戏服务器,它托管一个游戏的多个实例。玩家可以输入ID以加入当前正在运行的游戏。为了将客户机与他们想要的游戏实例配对,我有一个ETS表,它将游戏ID映射到处理特定游戏实例的Erlang进程的PID。虽然这样做有效,但我并不喜欢使用ETS,因为它创建的全局数据不受任何一个进程的控制 我想知道的是:在Erlang/OTP中是否有一种惯用的方法将标识符映射到进程?在这种情况下使用ETS可以吗,因为数据本质上是全局的?或者我应该有一个进程来存储所有ID到进程映射的字典?我觉得这更像是Erlang

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


我想知道的是:在Erlang/OTP中是否有一种惯用的方法将标识符映射到进程?在这种情况下使用ETS可以吗,因为数据本质上是全局的?或者我应该有一个进程来存储所有ID到进程映射的字典?我觉得这更像是Erlang风格,但可能没有表现得那么好或是并发的。我在查看其他SO答案时也遇到了问题,这似乎是一个改进的流程字典。但是,我的印象是不赞成使用流程字典()。

ETS表可以由给定的流程/gen_服务器控制,并且在出现问题时,可以通过或在表创建过程中从一个流程转移到另一个流程

许多游戏开发者依赖于类似于
memcached
的东西,这与
ETS
没有(故意)区别。然而,
mnesia
是一个非常稳定的OTP应用程序,与
ETS
相比,它可以处理更多的并发更新。我们在非常繁忙的应用程序中使用了mnesia,它从未停止运行,除非整个VM由于其他问题而停止运行。实际上,在erlang中构建的大多数可用系统都依赖于
mnesia
ETS
在冗余组件之间共享状态,以便在一个组件故障切换到另一个组件时,内存中的数据可用。

是一个非常方便的工具,特别是对于游戏之类的东西。这是因为,一个进程依赖于它自己易于访问的数据。没有其他进程可以查找其他进程的数据。因此,您可以使用
gproc
,而不是将游戏状态保留在
ETS


无论如何,如果您有时间,您可以尝试每个选项并进行一些负载测试,看看哪一个性能更好

gproc
()很好。与内置流程字典相比,它更稳定/改进。您也可以使用
mnesia
ram表,但我认为
ETS
也可以。看看这个问题,也不建议在全局模式下运行
gproc
。没错,但是:通过负载测试,您会发现
gproc
相当稳定。不确信,在进行负载测试时,我遇到了问题,
genu leader
在gproc中有许多全局注册的进程崩溃。这个答案给出了你所听到的最惯用的erlang响应:“尝试每个选项……看看哪一个性能更好”。除此之外,ETS表(可选地包装在
gen_server
s中)相当常见。对于非分布式的情况,gproc也能很好地工作。有关gproc使用的示例,请参见jlouis的项目。从其工作方式来看,Mnesia几乎是一个分布式ETS表,所以请务必查看该表。