开发笔记 (11) : 组播服务
最近一口气招了 5 个程序员, 在他们没有到岗之前,我不想把自己过多陷入游戏实现的细节上面。所以,除了维护一些前面的代码,陆续发现和修复一些 bug 外,我计划再完善一些基础设施的设计。这些基础模块暂时可以没有,如果实现好了又可以直接加入现有系统。这样比较利于后面的工作划分。
其中之一是服务器组播的模块。
先回顾一下前面提到的服务器架构(skynet ),它可以解决各个服务节点的命名问题,以及把消息从一个节点发送到另一个节点的能力。在不改变接口协议的前提下,最简单实现组播的方法就是把一个组命名为一个节点,由这个节点负责群法消息。
其工作原理类似于 UDP 的局域网组播。我还在网易时,实现过另一个类似的服务,见这篇 blog 。这次重新在另一个系统结构上做,有稍许不同。
主要的问题在于,组的管理(加入,退出组)和组本身如何区分。
按道理,组的管理和组播本来依赖同一份数据,即组员列表。系统构架最好是实现为表里如一。也就是说,接口上看起来是怎样切分功能的,那么实际功能就怎样物理上隔离比较好。那么,组播消息和组管理,最好看起来就在一个组的节点上。
但这样,会把“组”变成一个于单点不同的对象。必须对网络框架的 API 做修改。我首先放弃了这种方案。
另一个自然的方案是,把所有组的管理放在一起,由一个具名服务来提供。任何一个节点可以向这个组管理节点发送组管理的请求。比如创建一个新的组,并且把若干节点加入这个组里。并给这个组取一个名字。以后向这个特定名字的节点发送的消息,均组播给所有组员。
这样做比较干净,对组发消息可以和对单节点发消息一致。但组管理服务器和组本身看起来是两个名字。如果遵循表里如一的原则,它们的实现也最好在两个节点上。可是用现有的 skynet 接口,它们两者之间很难通讯。
蜗牛同学说服我,组播将是一个重要的基础设施,可以做在底层,成为系统的一部分。那么脏一点也无所谓了。就是说,表面上看起来它是一个独立服务,实际上是系统的一部分。我接受这个建议,这样就不用纠结于怎么把这个东西设计的更好的问题上了。反正不改动之前的设计,额外加这么一块最不影响开发进度了。
有了这样一个基础服务,下面做场景服务、队伍 API 、聊天服务,都会简单很多。
在没有把这个基础服务在通讯框架上实现出来之前,暂时先在 lua 层的库里面做个钩子,截获这些组播相关的调用,由每个节点自行群发消息也很容易模拟出来。
Comments
Posted by: 88娱乐城游戏 | (7) March 7, 2012 04:37 PM
Posted by: sword007 | (6) February 27, 2012 12:55 PM
Posted by: pppzzz | (5) February 24, 2012 12:33 AM
Posted by: flavor | (4) February 23, 2012 11:17 AM
Posted by: crazy | (3) February 22, 2012 06:43 PM
Posted by: ychellboy | (2) February 22, 2012 11:42 AM
Posted by: BIl | (1) February 22, 2012 09:17 AM