使用skynet 的一个简单范例,附分析

  之前已经介绍过, skynet 只是一个轻量框架,不是一个开箱即用的引擎 。能不能用好它,取决于使用者是否清楚知道自己要干什么,如果是用 skynet 做网络游戏服务器,那么就必须先知道网络游戏服务器应该如何设计。

  在 skynet 发布版中带的 example 中,有类似 gate watchdog agent 之类的服务,它们并不是唯一的用 skynet 构建游戏服务器的模式。我想另外写一个范例,示范依旧基于 skynet 但用不同的模式构建游戏服务器的方法。

  我花了两天时间写了这么一个 sample ,放在 github 上 。

  在这个范例中,我主要想展示这样一些东西:

  GateServer 并不是唯一的管理连接的模式。在 skynet 中,也可以自定义其它的方式来管理大量外部连接。这个例子中使用了前段时间我实现的另一个模块 ,这个模块并没有放在 skynet 发布版中。

  在这个范例中,实现了一个 hub 服务,类似 gate 的作用。但是它仅仅监听端口,并把新建连接交给合适的服务处理。按范例中的流程,每个新连接都直接转交 auth 服务;只有 auth 服务认可了连接,再转给 manager 服务。

  这里 auth 和 manager 都是单一服务。如果实际使用的时候有性能问题,auth 服务可以扩展为多个,做负载均衡。如果有必要,还可以加一个排队服务的环节。

  manager 拿到连接的身份后,会根据身份分派 agent 服务代理这个连接上的请求。注意:这里的代码并没有简单的为已认证身份的连接启动一个新的 agent 。这也是很多对 skynet 缺乏了解的同学普遍的误解——skynet 一定会为每个链接创建一个独立的 lua vm 。

  manager 管理若干 agent 的原则是,如果系统中没有为特定用户服务的 agent 存在,则启动一个新的。但即使这个用户连接断开,也不一定及时退出 agent 服务。agent 是否退出,是由 agent 自己决定的。manager 只负责将用户关联到活着的 agent 服务上。这个关联关系面向用户而不是面向连接的,多个连接可以同时通过 auth 认证,一起关联到同一个 agent 服务上(比如多客户端同时以不同连接接入)。

  manager 服务目前实现的还很简陋,但是稍加改造,就可以支持把多个用户关联到同一个 agent 。比如,做棋牌服务器时,你可能让同一个牌桌的用户在一起会更好。

  agent 服务可以用来处理业务逻辑。目前的范例中仅能处理 login 和 ping 请求。我们区分了 signin 和 login 。signin 表示用户已经通过了认证进入系统,但未必可以进行业务请求;而 login 表示被 agent 接受。这个范例里,如果一个用户 login 成功,在他的连接断开前,这个用户无法再次 login ;当然你可以稍微改造,变成后login 的用户顶掉前一个;或是让他们可以同存。

  这个范例还提供了一个不同于 snax 另一个简单封装。展示如何不用 skynet 早期提供的具名服务方式,而使用 skynet.uniqueservice 来取代它们。

  在这个范例封装中,只需要声明服务依赖的其它服务的名称就可以以正确的次序启动它们了。

  封装层把 skynet.dispatch skynet.info_func 等在编写 skynet 服务时的繁琐步骤简化了,它的工作原理理解起来可能比 snax 要简单一些,用起来也很容易。

  这次的客户端使用了一个开源的 lsocket 库,而不是 skynet 发布版中那个简陋的 clientsocket 模块。这能更好的暂时怎么编写 skynet 的客户端。

  同时,客户端中使用 sproto 协议的代码也更清晰一点,稍微做了一些封装,让代码比 skynet 自带的 example 更易读。

  服务器部分和客户端交互的部分也有对应的封装模块。

  关于客户端部分,我比较推崇只使用请求/回应模式,而不支持服务器推送数据。如果需要推送,可以用 long polling 解决。

  在客户端,和服务器不同,它要同时面对用户 UI 的交互、图像渲染、以及网络请求回应。所以我觉得不适合把服务器的那套 rpc 机制直接搬到客户端。所以在范例中,我也并没有使用 coroutine 来做 rpc 调用。

  callback 模式可能更适合客户端的工作。但 callback 并不是 rpc_call(request, cb) 这种。而是把 request (只可以从客户端发起,服务器永远只响应客户端的请求,而没有反向请求)的回应处理方法注册在一张表中。

  比如,有一个叫做 ping 的请求,客户端先定义好:

  function ping(req, resp, session)

  然后在需要 ping 服务器(对于客户端来说通常是由用户 UI 操作引起的)时,local session = request("ping", req) 就可以了。当收到服务器的 ping 回应时,上面的 ping 函数被回调,可以接收到当初 request 时发起的 req 数据,以及服务器传回的 resp ,和 session 。

  如果 ping 操作是无状态的,那么 session 多半可以忽略掉。在回调函数中,我们可以拿到提起请求时的内容 req ,也就不必再依赖其它状态了。

  有部分流程,可能依赖多次和服务器交互。这种带上下文的交互,或许我们应该用 coroutine 封装一下这类 RPC 调用?但目前最常见的多次交互只出现在登录认证流程中,似乎不必为它单独做太复杂的东西。

时间: 2024-10-11 22:50:59

使用skynet 的一个简单范例,附分析的相关文章

《Linux内核分析》MOOC课程 反汇编一个简单的C程序,分析汇编代码

一个简单c程序 分析一个简单的c程序 main.c 如下图: 用命令 gcc –S –o main.s main.c -m32编译成汇编文件.在汇编文件中有许多的虚指令并不会形成机器指令,为了使分析简单我们把大部分去掉: 得到如下图所示: 栈的介绍 APUE中指出每一个c程序,都有一个独立的地址空间,在内存中的典型布局如下: 对栈的操作和我们在数据结构中的栈的操作是类似的,ebp,esp(具体名称与cpu体系结构相关) 这两个寄存器直接与栈的操作相关. 栈地址是从高到低的方向分配的. 开始一个新

linux内核分析 第三周 构造一个简单的Linux系统MenuOS

一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持多种CPU类型的源代码,重点是x86·init目录:含有main.c,内核启动相关的代码基本都在init目录下·ipc目录:进程间的通信·kernel目录:有Linux内核的核心代码.四.构造一个简单的Linux系统 使用实验楼的虚拟机打开shell 1.cd LinuxKernel/2.qemu

通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1 1)实验部分(以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用 gcc –S –o main.s main.c -m32 命令编译成汇编代码,如下代码中的数字请自行修改以防与

理解计算机的工作方式——通过汇编一个简单的C程序并分析汇编代码

Author: 翁超平 Notice:原创作品转载请注明出处 See also:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  本文通过汇编一个简单的C程序,并分析汇编代码,来理解计算机是如何工作的.整个过程都在实验楼上完成,感兴趣的读者可以通过上面给出的课程链接自行动手学习.以下是实验过程和结果. 一.操作步骤 1.首先在通过vim程序建立main.c文件.代码如下: 图1 2.使用如下命令将main.c编

20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 进程上下文的切换 第一讲  Linux内核源代码介绍 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一般都基于此目录. init目录包含核心的初始化代码(不是系统的引导代

一个简单的远程溢出漏洞分析

人生第一个漏洞分析,好激动. 因为从来没有接触过漏洞分析方面,以前也只是看过一点书,所以一直想找个东西练练手,结果翻到了看雪Exploit me的题目,本来以为会很难,结果还是很基础的,适合我这样的新手练手. http://bbs.pediy.com/showthread.php?t=56998 进入正题 首先拿到了一个Windows程序,拖到IDA里打算看一下,结果发现程序逻辑出乎意料的简单.就是一个很常规的SOCKET流程带有一些错误处理. 下面详细说明. mov ebp,eax test

《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS

构造一个简单的Linux系统MenuOS 一.linux内核源代码简介 三大法宝(存储程序计算机.函数调用堆栈.中断)和两把宝剑(中断上下文的切换:保存现场和恢复现场.进程上下文的切换) 1.在linux内核源码里面arch占有的代码量相当庞大.arch/x86目录下的代码是我们重点关注的. 2.内核启动相关的代码基本都在init目录下(main.c). start_kernel是初始化linux内核的起点. start_kernel相当于c程序中的main函数 3.linux内核的核心代码在k

《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS

[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE(2.29——3.6)构造一个简单的Linux系统MenuOS SECTION 1 Linux内核源代码简介 1.操作系统的两把宝剑(回顾上一讲) 中断上下文的切换——保存现场&恢复现场 进程上下文的切换 2.Linux内核源代码简介 打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的

一个简单的HTML病毒分析

一直就想写这篇东西了,只是上班时说要上班,不写,回家后又忙着玩游戏,丢一边去了.现在只好不务正业的开写了,希望头儿不会知道我的blog.哈哈 在很久之前就对HTML的病毒很感兴趣了,很好奇怎么能远程向本地不经过允许就能下载可执行文件的,只是一直没机会搞得到ASP的原码,所以不才敢断章取义的去作什么分析.最近一次听一朋友说他看一个网页时病毒防火墙提示有病毒,叫我小心(先感谢一下他先),我闪了一下念头,就打开FlashGet把那个病毒首页下了下来. 稍微看了一下发现在首页代码的下面几行里有一个隐含的