architecture - 在 OTP/Erlang 中将 ID 映射到进程的惯用方式是什么?

标签 architecture erlang erlang-otp

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

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

最佳答案

ETS 表 可以由给定的进程/gen_server 控制,并且它们的所有权可以在出现问题时通过 ets:give_away/3 从一个进程转移到另一个进程或 heir option 在创建表的过程中。

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

gproc 是一个非常方便的工具,尤其适用于游戏之类的东西。这是因为,一个进程依赖于它自己易于访问的数据。没有其他进程可以查找另一个进程的数据。因此,除了在 ETS 中保存游戏状态,您还可以使用 gproc

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

关于architecture - 在 OTP/Erlang 中将 ID 映射到进程的惯用方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11027555/

相关文章:

architecture - CQRS - 执行两个处理程序

erlang - 如何确定 Erlang 应用程序未启动的原因?

Erlang的从模块: code and IO distribution

java - 在这种解析文本的场景中无法找出正确的数据结构和正确的方法

web-applications - Haxe 与 Lua 构建大流量 Web 应用程序

erlang - 停止 Erlang SSH channel 的问题

erlang - 为什么 Erlang 数字文字中的基数有 2..36 的任意限制?

ssl - Erlang ASN.1 otp 将 'PKCS7' 模块 p7b 文件编译为 pem

Erlang:supervisor(3),添加子进程

architecture - 在 DDD 架构中将帮助类放在哪里?