1.引言
集群(cluster)是将一组独立的计算机系统组合成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信。采用集群系统通常是为了提高系统的稳定性和网络中心的数据处理能力及服务能力。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。建立一个集群并不是一件简单的事件。集群往往要根据运行的主要应用进行调整,以使之运行在最佳状态,不存在建立集群系统的标准方案。
集群架构设计的目标应该是探索总结出可复用的架构模式和原则,以指导和简化这一类设计,同时开发出可复用的集群组件,保证集群的可伸缩、高效、稳定、容错、可扩展、可维护目标的达成。
2.Darkstar架构分析
Darkstar是一个具有前瞻性的线上游戏服务器端架构,它和以往的服务器端架构截然不同。Darkstar由一组独立的服务组成,每个服务都是一个编程接口。Darkstar提供的基本服务很像经典操作系统的服务,这些服务支持对持久存储的访问、调度任务、执行任务、与客户端进行通信。将系统分为若干服务是一种大型计算机系统所常用的分治思想,每个服务都抽象出接口,使得服务实现的变更不会互相影响。
客户端连接到游戏逻辑的通信机制是Darkstar基础设施的一部分,这些机制支持一种基于通道的广播,任何发往通道的消息都会送达这个通道的所有订阅者。
每个服务器上都会运行一个Darkstar栈,这些栈由一组元服务来协调。这些元服务监视所有独立的副本的持续工作,如果发现某个副本失效就会试着恢复。元服务还会跟踪各副本的负载,如果需要会重新分配负载或添加新的服务器到系统。这些机制对用户来说是不可见的,用户不需要改变逻辑代码即可获得这些伸缩性和容错性。
游戏逻辑可以访问Darkstar栈上提供的一组服务,这些服务时可以改变和配置的,但至少包括四个基本服务,他们是数据服务、任务服务、通道服务、会话服务。
这些Darkstar栈服务中最基本的是数据服务(Data Service),游戏逻辑可以用它来保存、读取、操作持久化数据。在Darkstar中任何存在时间超过一个任务的数据都被认为是持久数据,必须保存在数据服务中。
Darkstar栈中的任务服务(Task Service),用于调度和执行任务。任务可能是来自于客户端的某个动作或者游戏逻辑。这些任务大多是一次性的、短暂的,它们从数据服务中读取一些数据,操作回写部分数据,进行一些客户端通讯,然后结束。任务本身也可以生成其它的任务或者定期执行的任务。Darkstar的基础设施会尽其可能的调度任务,由客户端触发的任务和逻辑生成的任务将并行执行。
Darkstar栈中的会话服务(Session Service),用于客户端和游戏逻辑之间的通信。客户端在登录后会与服务器建立一个会话。服务器接收和解析客户端发出的消息以确定生成怎样的任务来响应。这种会话机制隐藏了客户端和服务器的真实端点,客户端只通过会话接收服务器响应。
Darkstar栈中的通道服务(Channel Service),用于一对多的通信。通道可以加入任意数目的客户端,任何发往该通道的消息都会被送往与通道相关的客户端。因为客户端是在客户的控制之下,客户端的代码和数据不能信任,所以所有的通道消息都是经过服务器的,服务器会进行逻辑检查。
3.集群方案详细设计
Service集群的可复用组件包括ServiceCenter、Deliver、Channel、Gate等。
ServiceCenter是Service架构的核心组件。ServiceCenter用于索引所有Service的注册进程。ServiceCenter接受对Service的注册、注销和对Service的查询。ServiceCenter在集群内是唯一而众所周知的,这意味着每个进程都知道ServiceCenter的地址。
ServiceCenter内部是一个类似multimap的数据结构,可以保持一对多的映射。这样,对于每一个可用的Service,ServiceCenter内部都保存了一个承诺提供这个服务的进程的列表。每个进程都在准备好提供服务后把自己注册到所承诺的Service的进程列表,在需要其它Service时查询相应进程列表从而连接到正确的进程,在取消服务前从进程列表注销自己。
每个进程和ServiceCenter之间的连接是长连接,即便没有消息发送也要保持连接,这样ServiceCenter就可以非常敏锐的侦测到进程的异常崩溃,维护进程列表的有效性。ServiceCenter并发的处理各个连接上的请求,几乎实时更新各个进程列表。
Deliver是一个特别的Service提供者。有时,一个进程不能提供一个完整的Service,它可以把自己能完成的那部分作为一个子服务进行注册。Deliver会注册一个完整的服务并将服务请求转包给这些注册了子服务的进程。这样,一个Deliver和若干个进程可以一起合作完成一个Service。
Gate是集群内外通信的门户。Gate一方面转发客户端发送来的信息到集群内部Service,另一方面转发集群内部Service的回复到客户端。
Channel是一种Deliver,它为集群提供基于会话的回复服务。Channel启动时会注册自己并通过查询ServiceCenter获得任意会话到代理这一会话的Gate的映射关系,当收到某个内部回复时Channel会利用这个映射转发回复。
4.集群实现
ServiceCenter内部含有一个Server及与之配合的IOServicePool、SocketPool,它们协作完成IOService分派、Socket分派、监听端口及应答会话的功能。
ServiceCenter内部还含有一个ServiceMap结构,用于将任意Service映射到它的ProcessList。ProcessList是一个简单的线性表,用于存储若干进程地址。
ServiceCenter对外提供了start()、stop()操作,用于开启和关闭服务。
ServiceHelp是用于代理ServiceCenter功能的代理类,ServiceHelp使用之前要先通过connect()连接ServiceCenter服务器,之后可通过regist、unregist把自己注册、注销以及通过search()查询某种Service资源。
Deliver内部含有一个Server及其配件IOServicePool、SocketPool,用于接受所承诺的Service请求。Deliver内部还含有一个ServiceHelp组件以方便注册、注销、查询,以及一个线性表ServantList存放Servant。
Deliver对外提供了regist()、start()、stop()操作。当调用start()启用服务时,Deliver会查询Service以确定Servant是否能完成这个Service。如果可以,Deliver会注册自己,同时连接这些Servant,并将它们放入ServantList中。 (责任编辑:南粤论文中心)转贴于南粤论文中心: http://www.nylw.net(南粤论文中心__代写代发论文_毕业论文带写_广州职称论文代发_广州论文网)