【问题标题】:How should Erlang deal with common data?Erlang 应该如何处理常见数据?
【发布时间】:2012-07-05 15:41:26
【问题描述】:

假设我正在使用 Erlang 构建游戏服务器。

每个用户检查某事(例如寻找最近的玩家)是非常普遍的循环,因此通常有一个经理类。

在上述情况下,我们使用互斥锁。

据我所知,Erlang 通常为每个 TCP 连接(用户会话)创建新的 Erlang 进程。 那么,用户会话列表如何循环使用呢?

如果我有这些用户会话的父进程并要求父进程,它可能是一个瓶颈?

【问题讨论】:

  • 简单地说状态由process维护,状态通过向processes收件​​箱发送消息来改变

标签: erlang


【解决方案1】:

现在,在继续之前,您可以查看以下问题和答案: Erlang: Distributed work on an arrayErlang gen_server with long-running tasks What is the best, most efficient, Client pool technique with Erlang

现在,了解 ETS TablesMnesia。那你或许可以看看GProc。制作一个特别为游戏保存状态数据的进程是危险的,因为当进程退出时状态可能会丢失。重新启动崩溃的进程很容易,但它所持有的数据会丢失。通常,我们需要不会丢失的内存数据存储,除非整个 erlang 虚拟机宕机(在这种情况下,如果您需要 RAM 之外的持久性,您仍然需要 DETS Tables 或 Mnesia)。

过程词典通常不受欢迎,但事实证明它们仍然非常有用。然而,就个人而言,ETS Tables 为我节省了很多。它们可以从一个崩溃的进程转移到下一个活着的进程。它们可以转储到磁盘或从磁盘加载,它们可以处理大量数据。

只需学习更多关于 Erlang 中使用的 IN-Memory 存储。顺便说一句,它还可以使用 erlang VM 之外的存储,例如 Memcached、Raik、CouchBase 等。但是,在某些情况下,游戏可以分解为像 QueuesListsRecords 这样的数据结构,这种数据结构可以保存在进程字典中。此外,这将取决于向客户端提供游戏服务的方式。如果游戏使用 HTTP (RESTFUL),那么您还将了解要应用哪些 Erlang 库(Mochiweb, Yaws,等等)。关注这整个tutorial,你会发现一切。

【讨论】:

  • 真的很有帮助!欣赏它!
猜你喜欢
  • 2013-02-27
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2021-02-26
  • 2015-02-12
相关资源
最近更新 更多