2

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

我想知道的是:在 Erlang/OTP 中是否有一种惯用的方式将标识符映射到进程? 在这种情况下使用 ETS 可以吗,因为数据本质上是全局的?或者我应该有一个进程来存储所有 ID 的字典来处理映射?我觉得这更像是 Erlang 风格,但可能不如高性能或并发。我在查看其他 SO 答案时也遇到了gproc,这似乎是一个改进的过程字典。但是,我的印象是不赞成使用进程字典(根据 erlang.org 网页)。

4

1 回答 1

6

ETS tables可以由给定的进程/gen_server 控制,并且它们的所有权可以在出现问题时通过或在表创建期间从进程转移到进程。许多游戏开发者依赖于与. 但是,它是一个非常稳定的 OTP 应用程序,与. 我们在非常繁忙的应用程序中使用了 mnesia,并且它从未出现过故障,除非整个 VM 由于其他问题而出现故障。实际上,大多数在 erlang 中构建的可用系统确实依赖于或用于在冗余组件之间共享状态,以便当一个故障转移到另一个时,内存中的数据是可用的。 ets:give_away/3 heir option

memcachedETSmnesiaETSmnesiaETS

gproc 是一个非常方便的工具,尤其适用于游戏之类的东西。这是因为,一个进程依赖于它自己易于访问的数据。没有其他进程可以查找其他进程的数据。所以,与其保持游戏状态ETS,不如使用gproc.

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

于 2012-06-14T06:29:18.593 回答