游戏服务器问题

151 views
Skip to first unread message

卓 一抗

unread,
Mar 4, 2013, 6:09:57 AM3/4/13
to erlang...@googlegroups.com
hello, 大家好,我最近在用erlang做游戏服务器,采用了进程字典存储玩家数据,一个玩家一个进程,让玩家上线时fork出进程来处理,这样带来的问题是:当玩家不在线时没有该进程存在,但是有时候游戏中需要很好的操作不在线玩家数据,读取和修改啥的,所以我想,能否在游戏服务器启动时就把数据库中所有玩家进程建立起来,永不退出,这样好吗? 会不会吃内存太凶,各位有这样实践过的吗?

周翀

unread,
Mar 4, 2013, 6:24:27 AM3/4/13
to erlang...@googlegroups.com
需要玩家数据的时候再去读数据库不行吗?如果是内存NoSQL数据库,延迟很小的,而且Erlang对于这种“阻塞”操作的代价很小。注意双引号。


2013/3/4 卓 一抗 <zhuoy...@nibirutech.com>
hello, 大家好,我最近在用erlang做游戏服务器,采用了进程字典存储玩家数据,一个玩家一个进程,让玩家上线时fork出进程来处理,这样带来的问题是:当玩家不在线时没有该进程存在,但是有时候游戏中需要很好的操作不在线玩家数据,读取和修改啥的,所以我想,能否在游戏服务器启动时就把数据库中所有玩家进程建立起来,永不退出,这样好吗? 会不会吃内存太凶,各位有这样实践过的吗?

--
您收到此邮件是因为您订阅了 Google 网上论坛的“Erlang China”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 erlang-china...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out





--

----
Cellphone: +86 137 6413 1714
twitter: @Xorcerer
Gtalk: xorce...@gmail.com
Msn: so...@hotmail.com

周翀

unread,
Mar 4, 2013, 6:25:34 AM3/4/13
to erlang...@googlegroups.com
我现在写游戏服务器,用C#的Task模拟轻量级进程的特性,用await模拟“异步读取,同步写法”的特性。数据库是Couchbase(原名Membase)


2013/3/4 周翀 <xorce...@gmail.com>

卓 一抗

unread,
Mar 4, 2013, 6:49:01 AM3/4/13
to erlang...@googlegroups.com

我采用的是mysql服务器,因为如果从mysql里读出来的的话,会有一系列的逻辑代码,不管是查看玩家数据或者修改玩家数据,而这些代码在进程字典模块都已经存在,所以我倾向于临时将这个玩家进程fork出来,用完之后将其退出。这样可以保持项目代码更加整洁。

卓 一抗

unread,
Mar 4, 2013, 6:50:09 AM3/4/13
to erlang...@googlegroups.com
为什么不采用erlang而选用c#呢,C#有什么优势吗??

Logan Zhou

unread,
Mar 4, 2013, 8:57:28 AM3/4/13
to erlang...@googlegroups.com
并发方面语言特性上没有特别突出的地方,我个人虽然喜欢C#,但矛盾的是不习惯在Windows上开发。
主要是老大本身比较保守,觉得C#语言特性比较传统,让C++程序员转过来容易,总体语言特性也相对优越(个人意见而已,至少Java近几年的特性一直在跟着C#走)。我们公司用Windows的人也多。

erlang相对来说非主流一点。

发自我的 iPad

在 Mar 4, 2013,19:50,卓 一抗 <zhuoy...@nibirutech.com> 写道:

> 为什么不采用erlang而选用c#呢,C#有什么优势吗??

Logan Zhou

unread,
Mar 4, 2013, 9:02:41 AM3/4/13
to erlang...@googlegroups.com
你的做法跟是否使用中途读取数据库没冲突。
创建玩家进程时读取数据库,填充进程字典。然后选择适当的时机结束进程,比如玩家离线到一定时间,或者限制总进程数。

发自我的 iPad

在 Mar 4, 2013,19:49,卓 一抗 <zhuoy...@nibirutech.com> 写道:

>
> 我采用的是mysql服务器,因为如果从mysql里读出来的的话,会有一系列的逻辑代码,不管是查看玩家数据或者修改玩家数据,而这些代码在进程字典模块都已经存在,所以我倾向于临时将这个玩家进程fork出来,用完之后将其退出。这样可以保持项目代码更加整洁。
>

卓 一抗

unread,
Mar 4, 2013, 9:07:34 AM3/4/13
to erlang...@googlegroups.com
对,如果玩家进程不在,我又需要从获取它的数据,就只有从mysql从读取了,但我不想这样,我想让进程常驻,比如假设服务器3万用户,就有3万个玩家进程,可以适当清楚掉僵尸用户的进程。

郎咸武

unread,
Mar 4, 2013, 9:15:31 AM3/4/13
to erlang...@googlegroups.com
把进程字典的数据映射到内存不可以吗?

在 2013年3月4日下午10:07,卓 一抗 <zhuoy...@nibirutech.com>写道:
对,如果玩家进程不在,我又需要从获取它的数据,就只有从mysql从读取了,但我不想这样,我想让进程常驻,比如假设服务器3万用户,就有3万个玩家进程,可以适当清楚掉僵尸用户的进程。
--
您收到此邮件是因为您订阅了 Google 网上论坛的“Erlang China”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 erlang-china...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out





--
只为成功找方法,不为失败找理由

卓 一抗

unread,
Mar 4, 2013, 9:16:35 AM3/4/13
to erlang...@googlegroups.com
不太懂,能否详细说下,进程字典的数据不就是在内存中吗?

郎咸武

unread,
Mar 4, 2013, 9:18:49 AM3/4/13
to erlang...@googlegroups.com
在mnesia 里面算则 ram存储

郎咸武

unread,
Mar 4, 2013, 9:19:08 AM3/4/13
to erlang...@googlegroups.com
在mnesia 里面选择 ram存储
--
只为成功找方法,不为失败找理由

郎咸武

unread,
Mar 4, 2013, 9:20:46 AM3/4/13
to erlang...@googlegroups.com
实在不行创建一个进程来专门管理,如果创建进程不用个人觉得有点浪费。
--
只为成功找方法,不为失败找理由

卓 一抗

unread,
Mar 4, 2013, 9:21:20 AM3/4/13
to erlang...@googlegroups.com
如果数据存储在mnesia当然可以这样,也不需要使用进程字典,直接操作mnesia就行了,但是我存储的地方是mysql,并且在玩家登陆时把数据load到代理进程字典。

郎咸武

unread,
Mar 4, 2013, 9:32:12 AM3/4/13
to erlang...@googlegroups.com
明白的,你存储到进程字典时不是一样从mysql里面读取的吗? 就是这一步换成mnesia. 
进程字典出现bug不好调试,前些日子我测试程序就用了进程字典,找了好久才发现进程字典造成的。
我通常都是用ets/mnesia 存储数据

卓 一抗

unread,
Mar 4, 2013, 9:35:51 AM3/4/13
to erlang...@googlegroups.com, 郎咸武

如果不用mysql,全部ets+mnesia,就没有我的问题了,因为ets和mnesia不管玩家在不在线都能方便的访问数据。主要是因为我已经选择了mysql+进程字典的方法,所以想把所有玩家进程建立起来,到达数据都在内存的效果,也不用单独写一套操作mysql的读取离线玩家数据的接口。


Bob

unread,
Mar 4, 2013, 9:09:11 PM3/4/13
to erlang...@googlegroups.com
呵呵。不敢苟同兄台的做法。我这里不讨论语言,也不讨论具体做法,就说几个原则吧:
1,对于你这种情况(离线玩家),还是懒加载方式比较好
2,对于玩家数据,考虑分布式方案可能对以后更有好处



Cheers,

---
Bob

On Monday, March 4, 2013 at 10:35 PM, 卓 一抗 wrote:


如果不用mysql,全部ets+mnesia,就没有我的问题了,因为ets和mnesia不管玩家在不在线都能方便的访问数据。主要是因为我已经选择了mysql+进程字典的方法,所以想把所有玩家进程建立起来,到达数据都在内存的效果,也不用单独写一套操作mysql的读取离线玩家数据的接口。


卓 一抗

unread,
Mar 4, 2013, 9:11:42 PM3/4/13
to erlang...@googlegroups.com
多谢指点,玩家数据的分布式方案怎么理解呢,能否详细描述下?

Bob

unread,
Mar 4, 2013, 9:15:09 PM3/4/13
to erlang...@googlegroups.com
兄台,详细方案不敢谈。我说出这个点的原因就是:对于游戏,尤其是网游来说,玩家的数据是非常大的,也就必须考虑分布式方案了。单机肯定不行。
所以,进程字典方案也许通过erlang本身的优势,可以达到多机存储,但是数据传输恐怕很麻烦。

So,我觉得还是整体综合考虑一下。呵呵



Cheers,

---
Bob

On Tuesday, March 5, 2013 at 10:11 AM, 卓 一抗 wrote:

多谢指点,玩家数据的分布式方案怎么理解呢,能否详细描述下?

卓 一抗

unread,
Mar 4, 2013, 9:20:17 PM3/4/13
to erlang...@googlegroups.com
因为我采用的是myql,分服务器建立数据库存储,单服数据量并不大,注册人数限制在5W左右,然后玩家登陆建立进程并将数据load到进程字典,这样不存在传输的问题。

如果是大服务器,像最近的《我叫mt》,所有玩家都在一个服务器上玩,单台服根本存不下,就不得不考虑分布式方案了,

这样理解你觉得对吗?

Bob

unread,
Mar 4, 2013, 9:23:54 PM3/4/13
to erlang...@googlegroups.com
不是单独说存储的问题,而是说从整体角度来看这个问题。
比如说:有服务器A,B,C,如果用户数据比较大,在B上,那么如果用户进程在B上,将是最有效的。



Cheers,

---
Bob

Zhibin Zheng

unread,
Mar 5, 2013, 2:11:59 AM3/5/13
to erlang...@googlegroups.com
我觉得这个看需求和架构Erlang系统的程度来决定的。

其实,在现有“一抗”的需求下,Erlang + 进程字典 + MySQL,将来也可以很容易扩展到将来的分布式。

只需将MySQL分布式,然后Erlang 分布式 VM之间可以通讯,就可以了。

至于说用进程字典来做中间层不太推荐,用Mnesia比较推荐。当然也不是说进程字典不可以,只是说看怎么用,和什么人用。安全保险的用Mnesia最好。

BR.
Witeman

卓 一抗

unread,
Mar 5, 2013, 3:08:23 AM3/5/13
to erlang...@googlegroups.com
哈哈,谢谢whiteman,意思是只把在线玩家数据load到mnesia(mnesia可以做个持久化因此更安全吗?),落地还是mysql。 但是mysql的分布式不是只是主从吗?这个扩展到不分布式吧???无法存储大量数据。

Zhibin Zheng

unread,
Mar 5, 2013, 3:57:11 AM3/5/13
to erlang...@googlegroups.com
MySQL只是一个数据库,具体如何分布式,这个就要看你自己架构了。你看淘宝也不是用MySQL,他是怎么分布式的?

就好像说,分布式程序的数据是保存在物理硬盘上的,虽然物理硬盘不是分布式的,可是程序是分布式的,那么数据就可以实现分布式嘛。这个道理一样,MySQL只是一个组织存储数据的一种方式方法。当然用NoSQL的法方可能会更适合分布式。

对了,不是Whiteman,这个是姓^_^

我是Wit-e-man,"wit"是智慧的词根,e for Energetic,man for "Man" ^_^

BR.
Witeman

在 2013-3-5,下午4:08,卓 一抗 <zhuoy...@nibirutech.com> 写道:

> 哈哈,谢谢whiteman,意思是只把在线玩家数据load到mnesia(mnesia可以做个持久化因此更安全吗?),落地还是mysql。 但是mysql的分布式不是只是主从吗?这个扩展到不分布式吧???无法存储大量数据。
>

YF CAO

unread,
Mar 6, 2013, 3:05:18 AM3/6/13
to erlang...@googlegroups.com
偏重性能方案: 
                     client
                        |
                        |
                      router
                      /   \
                    /       \
                 bll       bll
                  |          |
               mem  =  mem
                  |          |
                db         db


偏重数据实时性方案:
                 client
                    |
                    |
                 router
                 /   \
               /       \
   mem---bll       bll ---mem
              |          |
             db        db
Reply all
Reply to author
Forward
0 new messages