skynet:开始

skynet 是一个为网络游戏服务器设计的轻量框架。

简单的 web 服务倾向于把和用户相关的状态信息(设计好数据结构)储存在数据库中,通过网络收到用户请求后,从数据库中读出关联该用户的状态信息,处理后再写回数据库。而网络游戏服务通常有更强的上下文状态,以及多个用户间更复杂的交互。如果采用相同的模式,数据库和业务处理模块间很容易出现瓶颈,这个瓶颈甚至不能通过增加一个内存 cache 层来完全解决。

在 skynet 中,用服务 (service) 这个概念来表达某项具体业务,它包括了处理业务的逻辑以及关联的数据状态。对,使用 skynet 实现游戏服务器时,不建议把业务状态同步到数据库中,而是存放在服务的内存数据结构里。服务、连同服务处理业务的逻辑代码和业务关联的状态数据,都是常驻内存的。如果数据库是你架构的一部分,那么大多数情况下,它扮演的是一个数据备份的角色。你可以在状态改变时,把数据推到数据库保存,也可以定期写到数据库备份。业务处理时直接使用服务内的内存数据结构。

简单说,可以把 skynet 理解为一个简单的操作系统,它可以用来调度数千个 lua 虚拟机,让它们并行工作。每个 lua 虚拟机都可以接收处理其它虚拟机发送过来的消息,以及对其它虚拟机发送消息。每个 lua 虚拟机,可以看成 skynet 这个操作系统下的独立进程,你可以在 skynet 工作时启动新的进程、销毁不再使用的进程、还可以通过调试控制台监管它们。skynet 同时掌控了外部的网络数据输入,和定时器的管理;它会把这些转换为一致的(类似进程间的消息)消息输入给这些进程。

例如:

在网络游戏中,你可以为每个在线用户创建一个 lua 虚拟机(skynet 称之为 lua 服务),姑且把它称为 agent 。用户在不和其它用户交互而仅仅自娱自乐时,agent 完全可以满足要求。agent 在用户上线时,从数据库加载关联于它的所有数据到 lua vm 中,对用户的网络请求做出反应。当然你也可以让一个 lua 服务管理多个在线用户,每个用户是 lua 虚拟机内的一个对象。

你还可以用独立的服务处理网络游戏中的副本(或是战场),处理玩家和玩家间,玩家协同对战 AI 的战斗。agent 会和副本服务通过消息进行交互,而不必让用户客户端直接与副本通讯。

我们通常建议使用一个网关服务,专门监听端口,接受新连接。在用户身份确定后,再把真正的业务数据转交给特定的服务来处理。同时,网关还会负责按约定好的协议,把 TCP 连接上的数据流切分成一个个的包,而不需要业务处理服务来分割 TCP 数据流。业务处理的服务不必直接面对 socket 句柄,而由 skynet 正常的内部消息驱动即可。这样的网关服务,skynet 在发布版里就提供了一个,但它只是一个可选模块,你大可以不用它,或自己编写一个类似的服务以更符合你的项目需求。

猜你喜欢

转载自www.cnblogs.com/losophy/p/9205324.html