« 更健壮的 C++ 对象生命期管理 | 返回首页 | 唯一的游戏世界 »

游戏服务器组间的通讯

网络游戏世界的构建有越来越大的趋势,游戏设计者希望更多的人可以发生互动。技术人员的工作就是满足这些越来越 BT 的需求。

我们目前这个项目由于是自己主导设计,而我本人又是技术方案的设计者。所以,技术解决不了的问题就不能乱发牢骚了。作为游戏设计者,我希望整个游戏世界的参于者可以在一个唯一的大世界中生存,他们永远有发生互动的可能。注意这里只是保留这种可能性,实际上,即使是现实社会,每个人的社交圈子都不大。即使是千军万马的战场上,无论是将军还是士兵,都不需要直接跟太多人互动。

我们的游戏的技术解决方案仍旧是将游戏大世界分成若干独立服务器组,人为的将人群切分成更小的独立单位。这里,技术上需要解决的是:服务器组间可以灵活的交换数据。

最近几天正是在设计服务器组间的通讯方案,初步的想法是在每个服务器组中安放一个独立服务进程,称之为“邮局”。各个服务器组中邮局之间可以相互发现并交换数据。

服务器组内部的各个进程通过向邮局投递或收取邮件来跟其他服务器组通讯。这个邮局提供类似 POP3/SMTP 的服务。实际上,我在通讯协议设计上,几乎照搬了 POP3/SMTP 。不过,在原有协议上加了一个强制的回执。这个对内部交互通讯的可靠性非常重要。

有了这样的设计,各种玩法的实现就会比较容易。比如对于玩家的迁徙,只需要在每个服务器组内设置一个“移民局”。玩家迁徙请求发出时,系统发出邮件到对方的“移民局”,把玩家数据 copy 过去。等到回执后,再要求玩家在新服务器组上登陆。同样,玩家物品的转移和商业系统也可以依靠专门的“联邦快递”进行。

邮局系统可以以单个队列来完成其它模块的请求,用时间来换取低负载。只要不设计出高度要求交互的跨服务器组玩法,这些应该是足够满足要求的。

有了邮局系统,我们甚至不再需要庞大的全局数据库。每个服务器组保留自己独立的数据库。只在发生交互的时候相互用邮件交换数据。全局的统计也可以由互发邮件来完成。

Comments

"邮局"的想法不错,不过云你不需要再重新发明轮子了,现有的POP3/SMTP协议已经能满足你的需求了,已经支持"read/delivery receipt requrested"功能了,这样服务器是现成、成熟的,直接利用现成的POP3/SMTP server即可。所需要开发的只是做个POP3/SMTP client(i.e. "移民局"),负责将用户数据从DB里dump出来作为email附件发送、接收、import到DB。

不错。学习学习

就应该让懂技术的人来做游戏设计,就算瞎掰也瞎掰的靠点边。

IMAP 和 POP3 协议都考虑过,有些细节不合适。

对于这里需要解决的问题,如果 IMAP 协议是适用的,那么 POP3 也是适用的。 IMAP 相对于 POP3 解决的问题,在这里不存在。

为什么不照搬IMAP...

恩, 有点意思. 不知道你们一个服务器组,或者说一个游戏世界打算承载多少人呢

我们组有两个同事正在考察和学习 Erlang 已经有好几个月了 ;)

最近在看Erlang 这个语言,
Erlang的作者也强调现实社会中人与人之间也是通过发送消息来通讯,协作。
Erlang中也有类似邮局来处理消息。
从某种角度来看,某个服务器可以看作一个国家。
移民局,邮局这些概念很是贴切。哈哈。

邮局虽然好理解,但当GM或者其他人需要去查询玩家数据时,会碰到一个问题,那就是玩家的数据在不停的移动中,不能保证他移动过程的完整和安全,最终回归数据库时也会缺少必要的检验机制,我不认同这样的一种松散而且不安全的做法。玩家数据应该需要统一管理!

请教云风:如何把2D游戏的图片拉大,这个函数我们需要,但不知提高效率的写法,请指教。

QQ:1254408

以前了解的一款网游《成汤天下》好像使用了类似的架构,可惜那游戏被美工给毁了

前段时间看了《代码大全》。这篇博客贴切地证明了书中第二章对设计隐喻的重要性的说明。:)
设计大致上是很多人可以想到的,
但是在“邮局”、“移民局”、“联邦快递”这一套隐喻对系统理解和思考起到了很大帮助。
起码,我一看就明白这个设计是怎么一回事了。 呵呵

MQ发送异步消息,而且对消息大小有限制。
云风说的转发的数据应该是用户的属性数据,这些数据非常大,很多游戏的用户数据至少4K以上。根本不适合MQ

cool~

游戏做的越来越象真实的社会了

>>>这个用MSMQ或者其他MQ产品就可以实现了,没必要自己实现的。

你说的不适用于游戏...

单一服务器有一个问题:在游戏初期玩家比较多的时候,如何提升单区内玩家容纳能力;到游戏后期,单区内玩家减少,如果回收前期投入的服务器资源?

有趣:)

to sheep, 我们游戏在 05 年设计之初,就把统一世界放在基本点上了 :)

这个用MSMQ或者其他MQ产品就可以实现了,没必要自己实现的。

最好当然是服务器对大家都是透明的。。。
同一世界同一个梦
呵呵

Post a comment

非这个主题相关的留言请到:留言本