skynet

skynet 入门笔记(1):Hello, skynet!

為{幸葍}努か 提交于 2019-12-07 17:34:25
Hello, Skynet! Skynet这名字让我想起了经典科幻电影《终结者》里毁灭人类世界的终极人工智障,skynet的官方文档是挺给力的,但是没有那么好的引导机制,看了半天的文档还是不知道该怎么用skynet去写个最简单的Hello world,于是我就对着各种example试了半天。。 正文 skynet 不能被 install 到其他地方去,别想了。先写出Hello world再考虑其他问题吧。 这里就一口气搭建一个完整的project模板。 # 创建目录并初始化git仓库,当然也可以不这么做,记得把 skynet clone 下来就好。 mkdir project cd project git init . touch readme.md git add readme.md git commit -m 'first commit' git submodule add htttps://github.com/cloudwu/skynet.git # 编译 skynet pushd skynet make linux # 记得先装上依赖库 popd # 软链接出必要的库,大多 service 和必要的代码都在这里面 ln -s ./skynet/cservice ./ ln -s ./skynet/luaclib ./ ln -s ./skynet/lualib ./ #

为skynet移植一个lua-websocke库

夙愿已清 提交于 2019-12-07 17:34:15
为skynet移植一个lua-websocke库 简介 目前大部分游戏、移动互联网、H5客户端主要由JavaScript、Lua、C#、C++等语言进行逻辑开发, 其主要通讯方案便是基于HTTP协议的接口请求与Websocket的推送方案. 起因 skynet 内部实现了一套同步非阻塞 socket 库, 并且提供了TCP通讯方案进行数据流分割. 所谓的TCP数据流 分割 . 就是根据一定方式读取数据的一种流程. 最为常见的数据分割方案应该是: 2字节头部 + 数据载荷. 另一种通用方案是将头部扩展为4字节, 这样在头部信息中可以包含协议版本或者消息类型还可以进行平滑的进行协议升级扩展. 这些方案一般用于定制C/S网络协议. 绝大多数场景中并没有必须使用到这个场景, 且维护一套这样的协议也是需要占用开发周期的.本人也使用过国内的开发者基于skynet编写的websockket开发库. 就使用上来说效果不是很理想, 且期间遇到的一系列问题也需要自己实际定制化后才能解决. 刚好近期由于正在为开发的Lua Web框架编写 Websocket使用教程 , 那么干脆趁这个机会为skynet移植一套专用的websocket库. 编写完成后, 我将它随意的命名为: skynet-lua-websocket . 开始移植工作 1. 握手流程 skynet

游戏服务器架构调研报告

隐身守侯 提交于 2019-12-07 17:33:59
服务器架构调研报告 刘源霖 20151119 1. 前言 本文档主要是调研分析新的手游服务端架构,为下一款手游服务端研发提供可参考的方案。主要的参考点是数据持久化,并发效率,分布式,沙盒机制,热更新机制,研发维护成本。如果从头根据需求开发一款新的服务器架构,需要大量的时间,而且可能会得不偿失,一款新的架构稳定都需要时间的。我们应该尝试使用开源的,成熟的,活跃度高的开源框架。正文将先从服务器设计需要考虑的因素进行需求分析,以至明确我们需要的服务器架构原型,然后再分析现有的开源架构方案。 2. 游戏服务器设计因素 2.1. 服务器运行平台选择 服务器操作系统大多采用 Unix 和 Linux 操作系统,而 Linux 发行版本系统中,多使用 CentOS 、 Redhat 、 Ubuntu 、 Gentoo 、 Debian 。而这些发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本,前者以著名的 Redhat ( RHEL )为代表,后者以 Debian 为代表。 Redhat 的稳定性和硬件兼容性都比 Debian 高。并且 RHEL 的生命周期是 7 到 10 年,基本上可以覆盖硬件的生命周期,也就意味着一个新硬件安装以后,不用再次安装操作系统。而 Debian 的生命周期是不固定的,一般新版本发布以后,上个版本再维护 18 个月。而

Skynet Cluster 简介

我的梦境 提交于 2019-12-07 04:31:45
Skynet Cluster 简介 Cluster 模块负责 Skynet 节点之间的通信。 Cluster 概述 | --- --- ---> | node1 | | node2 | <-- --- --- | 两个节点之间通信最多会创建 2 条 TCP 链路 。如上图所示。 节点 node1 主动向 node2 发起通信和 node2 的回应是 一条 TCP 链接 。 节点 node2 主动向 node1 发起通信和 node1 的回应是 另一条 TCP 链接 。 Cluster 模块包含三个服务: clusterd clusteragent 和 clustersender ,通信使用 gate 服务。 clusterd 服务提供管理功能,初始化 gate 服务监听网络连接。每个节点只存在一个 clusterd 服务。 gate 服务接收到新的 socket 连接时,通知 clusterd 服务,此时创建 clusteragent 服务接收数据。每个 clusteragent 服务对应一个 socket 连接。 主动与其它节点通信时, clusterd 服务创建 clustersender 服务建立连接并发送数据。每个 clustersender 服务对应一个 socket 连接。 举个例子。假设存在如下节点配置: center = "192.168.1.1:10000"

Skynet Cluster 简介

你说的曾经没有我的故事 提交于 2019-12-07 04:16:03
Skynet Cluster 简介 Cluster 模块负责 Skynet 节点之间的通信。 Cluster 概述 | --- --- ---> | node1 | | node2 | <-- --- --- | 两个节点之间通信最多会创建 2 条 TCP 链路 。如上图所示。 节点 node1 主动向 node2 发起通信和 node2 的回应是 一条 TCP 链接 。 节点 node2 主动向 node1 发起通信和 node1 的回应是 另一条 TCP 链接 。 Cluster 模块包含三个服务: clusterd clusteragent 和 clustersender ,通信使用 gate 服务。 clusterd 服务提供管理功能,初始化 gate 服务监听网络连接。每个节点只存在一个 clusterd 服务。 gate 服务接收到新的 socket 连接时,通知 clusterd 服务,此时创建 clusteragent 服务接收数据。每个 clusteragent 服务对应一个 socket 连接。 主动与其它节点通信时, clusterd 服务创建 clustersender 服务建立连接并发送数据。每个 clustersender 服务对应一个 socket 连接。 举个例子。假设存在如下节点配置: center = "192.168.1.1:10000"

Skynet Cluster 简介

旧巷老猫 提交于 2019-12-06 16:45:40
Skynet Cluster 简介 Cluster 模块负责 Skynet 节点之间的通信。 Cluster 概述 | --- --- ---> | node1 | | node2 | <-- --- --- | 两个节点之间通信最多会创建 2 条 TCP 链路 。如上图所示。 节点 node1 主动向 node2 发起通信和 node2 的回应是 一条 TCP 链接 。 节点 node2 主动向 node1 发起通信和 node1 的回应是 另一条 TCP 链接 。 Cluster 模块包含三个服务: clusterd clusteragent 和 clustersender ,通信使用 gate 服务。 clusterd 服务提供管理功能,初始化 gate 服务监听网络连接。每个节点只存在一个 clusterd 服务。 gate 服务接收到新的 socket 连接时,通知 clusterd 服务,此时创建 clusteragent 服务接收数据。每个 clusteragent 服务对应一个 socket 连接。 主动与其它节点通信时, clusterd 服务创建 clustersender 服务建立连接并发送数据。每个 clustersender 服务对应一个 socket 连接。 举个例子。假设存在如下节点配置: center = "192.168.1.1:10000"

Linux命令备忘录:mount用于加载文件系统到指定的加载点

喜夏-厌秋 提交于 2019-12-03 01:50:13
mount命令用于加载文件系统到指定的加载点。此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命令来手动完成挂载。 语法 mount(选项)(参数) 选项 -V:显示程序版本; -l:显示已加载的文件系统列表; -h:显示帮助信息并退出; -v:冗长模式,输出指令执行的详细信息; -n:加载没有写入文件“/etc/mtab”中的文件系统; -r:将文件系统加载为只读模式; -a:加载文件“/etc/fstab”中描述的所有文件系统。 参数 设备文件名:指定要加载的文件系统对应的设备名; 加载点:指定加载点目录。 实例 mount -t auto /dev/cdrom /mnt/cdrom mount: mount point /mnt/cdrom does not exist /mnt/cdrom目录不存在,需要先创建。 cd /mnt -bash: cd: /mnt: No such file or directory mkdir -p /mnt/cdrom 创建/mnt/cdrom目录 ls bin dev home lib media mnt proc sbin srv tmp var boot etc initrd lost+found misc opt root

skynet消息队列结构分析

匿名 (未验证) 提交于 2019-12-03 00:39:02
队列一般可以用链表来模拟,用两个指针,分别指向头节点和尾节点。尾节点指向插入数据的方向,头节点指向消耗数据的方向。skynet全局消息队列也用到了上面的数据结构: struct message_queue { struct spinlock lock; uint32_t handle; int cap; int head; int tail; int release; int in_global; int overload; int overload_threshold; struct skynet_message *queue; struct message_queue *next; }; struct global_queue { struct message_queue *head; struct message_queue *tail; struct spinlock lock; }; 每个节点的类型是message_queue,实际上他也是个消息队列,称为次级消息队列。重点说一下这个次级消息队列的数据结构与算法。 次级消息队列,实际上是一个数组,也就是缓冲区。他有两个哨兵,分别指向他的头部和尾部(head和tail)。次级消息队列中消息的push和pop实际上用到的是所谓的环形队列,他的思想是,刚开始时head和tail都为0,当有push数据后,tail开始移动

利用 telnet 调试 skynet

匿名 (未验证) 提交于 2019-12-03 00:26:01
Ŀ¼ 一、安装 telnet 1、安装必要软件包 2、配置修改 二、重启服务 1、超级守护进程 2、23端口 三、启动 skynet 控制台服务 四、telnet 连接 五、skynet 命令行 一、安装 telnet 1、安装必要软件包 yum install - y memcached yum install - y telnet yum install - y telnet - server 2、配置修改 vi / etc / xinetd . d / telnet disable = no 二、重启服务 1、超级守护进程 [ root@localhost /]# service xinetd restart Stopping xinetd : [ OK ] Starting xinetd : [ OK ] 2、23端口 [ root@localhost /]# netstat - tnlp 三、启动 skynet 控制台服务 skynet . newservice ( "debug_console" , 8000 ) 四、telnet 连接 [ root@localhost ~]# telnet 127.0 . 0.1 8000 Trying 127.0 . 0.1 ... Connected to 127.0 . 0.1 . Escape character is '^]

skynet服务的本质与缺陷

匿名 (未验证) 提交于 2019-12-03 00:22:01
skynet服务的设计 统观整篇文章,不难发现: 每个skynet服务都是一个lua state,也就是一个lua虚拟机实例。而且,每个服务都是隔离的,各自使用自己独立的内存空间,服务之间通过发消息来完成数据交换。 架构图如下: 图片取自spartan1的 skynet任务调度分析 lua state本身没有多线程支持的,为了实现cpu的摊分,skynet实现上在一个线程运行多个lua state实例。而同一时间下,调度线程只运行一个服务实例。为了提高系统的并发性,skynet会启动一定数量的调度线程。同时,为了提高服务的并发性,就利用lua协程并发处理。 所以,skynet的并发性有3点: 1、多个调度线程并发 2、lua协程并发处理 3、服务调度的切换 skynet服务的设计基于Actor模型。有两个特点: 1. 每个Actor依次处理收到的消息 2. 不同的Actor可同时处理各自的消息 实现上,cpu会按照一定规则分摊给每个Actor,每个Actor不会独占cpu,在处理一定数量消息后主动让出cpu,给其他进程处理消息。 skynet服务的缺陷 并发问题 这要从skynet一个服务霸占调度器的极端例子说起。 [plain] view plain copy print ? -- main.lua local skynet = require "skynet" skynet