假设我正在使用 Erlang 构建游戏服务器。
每个用户检查某些内容(例如找到最近的玩家)是很常见的,因此通常有一个管理器类。
在上面的例子中,我们使用互斥锁。
据我所知,Erlang 通常会为每个 TCP 连接(用户会话)创建新的 Erlang 进程。
那么,用户会话列表如何进行流通呢?
如果我有这些用户会话的父进程并询问父进程,这可能是一个瓶颈?
现在,在继续之前,您可以查看以下问题和答案: https://stackoverflow.com/q/9104447/431620Erlang:数组上的分布式工作 https://stackoverflow.com/q/9104447/431620 , https://stackoverflow.com/q/8879177/431620Erlang gen_server 具有长时间运行的任务 https://stackoverflow.com/q/8879177/431620 , and https://stackoverflow.com/q/9097694/431620Erlang 最好、最高效的客户端池技术是什么 https://stackoverflow.com/q/9097694/431620
现在,了解一下碳排放交易体系表 http://www.erlang.org/doc/man/ets.html and Mnesia http://www.erlang.org/doc/man/mnesia.html。那么你也许可以看看GProc http://rustyklophaus.com/articles/20090916-GProcErlangGlobalProcessRegistry.html。创建一个进程来保存状态数据(特别是对于游戏)是危险的,因为当进程退出时状态可能会丢失。重新启动崩溃的进程很容易,但它所保存的数据会丢失。通常,我们需要内存中的数据存储,除非整个 erlang VM 宕机,否则数据不会丢失(在这种情况下,如果您需要 RAM 之外的持久性,则需要DETS 表 http://www.erlang.org/doc/man/dets.html或 Mnesia 仍然)。
过程字典通常不被鼓励,但事实证明它们仍然非常有用。然而,就我个人而言,ETS Tables 为我节省了很多。它们可以从一个崩溃的进程转移到下一个存活的进程。它们可以转储到磁盘或从磁盘加载,并且可以处理大量数据。
只需更多地研究 Erlang 中使用的内存存储即可。顺便说一句,它还可以使用 erlang VM 外部的存储,例如 Memcached、Raik、CouchBase 等。然而,在某些情况下,游戏可以分解为数据结构,例如Queues http://learnyousomeerlang.com/a-short-visit-to-common-data-structures#queues, or Lists http://learnyousomeerlang.com/starting-out-for-real#lists or Records http://learnyousomeerlang.com/a-short-visit-to-common-data-structures#records,可以保存在进程字典中的数据结构。此外,这还取决于向客户提供游戏服务的方式。如果游戏使用 HTTP (RESTFUL),那么您还将了解要应用哪些 Erlang 库(Mochiweb、雅司病 https://stackoverflow.com/a/6466089/431620, ETC。)。只要遵循这个整体tutorial http://learnyousomeerlang.com/content,你会发现一切。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)