百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

云风skynet-游戏开发核心技术实战:手撕一个高性能网关

qiyuwang 2024-11-18 16:16 64 浏览 0 评论

专注分享Linux后台服务器开发,包括C/C++,Linux,Nginx,Skynet,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体服务器,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等技术,文末领取资料福利包!

一、环境安装

1. centos

yum install -y git gcc readline-devel autoconf

2. ubuntu

apt-get install git build-essential readline-dev autoconf

apt-get install git build-essential libreadline-dev autoconf (for ubuntu 16.04)

3. mac

brew install git gcc readline autocon

二、获取代码以及编译

git clone https://github.com/cloudwu/skynet.git

cd skynet

centos&&ubuntu:

make linux

mac:

make macosx

三、关于 win10

1. 开启开发者模式

系统设置->更新和安全->针对开发人员->开发者模式

2. 启用 linux 子系统组件

系统设置->应用->程序和功能->启动或关闭 windows 功能->适用于 linux 的 windows 子系

统->重启更新

3. 安装 linux 子系统

windows 应用商店->Ubuntu->修改 sources.list

https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

选择 18.04LTS

4. 在 win10 中 vscode 安装 wsl 插件

5. 在子系统 Ubuntu 中添加 skynet 源码

四、多核开发与 actor 模型

1. 多进程

a) 消息队列

i. 协议问题

ii. 断线重连

iii. 进程启动顺序问题

iv. 负载均衡问题

v. 数据同步问题

b) RPC

i. 两个系统保持同步问题

c) zk

i. 配置项管理问题

ii. 集群管理

iii. 统一命名问题

iv. 状态同步问题

v. 分布式锁问题

d) 拆分

i. 功能拆分

ii. 热点拆分

2. 多线程

3. 并发模型 :CSP 模型 与 actor 模型

4. 结论:多进程并发实体是进程,多线程并发实体是线程,go 并发实体是 goroutine(协

程),actor 并发实体是 actor(语言层面抽象出来的“进程”)。它们都是在隔离性(运行环

境)与统一性(数据统一)之间作取舍平衡,而 actor 模型在语言层面做运行环境的隔离,

数据同步依然需要通过消息来同步。actor 模型是加强版的多进程解决方案,进程间通信由

socket 转为指针的传递,从而通信变得更加可靠,同时多进程解决方案中,公共开源组件(消

息队列,rpc,zookeeper)解决的问题,在 actor 模型中处理起来更方便。

5. actor 定义:

a) 用于并行计算

b) actor 是最基本的计算单元

c) 基于消息计算

d) actor 之间通过消息沟通并且相互隔离

五、skynet 中的 actor 模型

1. 结构组成

a) 隔离的环境(内存块或 lua 虚拟机)

b) 消息队列

c) 回调函数

2. 实现

a) logger 服务 service-src/service_logger.c

b) lua 服务启动器 service-src/service_snlua.c

六、actor 运行以及消息调度

1. 消息队列

a) 全局消息队列

b) actor 消息队列

2. skynet 中锁的使用

a) 互斥锁

b) 自旋锁

i. worker 轮询消息队列

c) 读写锁

i. handle_storage

d) 条件变量

i. worker 线程的休眠

3. skynet 中线程

a) timer

b) socket

c) worker

i. “权重”来定制消费消息的数量(-1 消费一个,0 全部消费,1 消费一半)

ii. 休眠(条件变量)与唤醒(timer 和 socket)

d) monitor

i. 检查服务消息过载

七、lua 与 c 接口编程

1. lua 数据类型

a) boolean,number,string,function,userdata,lightuserdata,thread,table(__index,__newind

ex,__gc,__len),nil

2. table

a) table.concat

b) table.insert

c) table.remove

d) table.sort

e) hash 表来使用

3. 元表

a) 定制行为 __index, __newindex

b) 只有 table 和 userdata 对象有独自的元表,其他类型只有类型元表

c) 只有 table 可以在 lua 中修改设置元表

d) userdata 只能在 c 中修改设置元表,lua 中不能修改 userdata 元表

4. 协程

a) 一段独立的执行线程

b) 一个 lua 虚拟机中同时只能有一个协程在运行

c) 目的:写的时候是同步的书写方式,而实际内部是异步非阻塞的实现

5. 闭包

a) 表现

i. 函数内部可以访问函数外部的变量

ii. lua 文件是一个匿名函数

b) 实现

i. c 函数以及绑定在 c 函数上的 upvalues(上值)

c) 用 lua_pushcclosure 用来创建 c 闭包

d) 通过 lua_upvalueindex 伪索引来获取上值

6. 虚拟栈

a) 栈上的都是 lua 类型的值

b) lua 调用 c 的函数都得到一个新的栈,独立于之前的栈

c) c 调用 lua,每一个协程都有一个栈,没有显示创建那么就是主协程上一个栈

7. 注册表

a) 预定义的表,用来保存任何 c 代码想保存的 lua 值

b) 使用 LUA_REGISTRYINDEX 来索引

八、skynet 网络 IO

1. 阻塞 io 和非阻塞 io

a) 阻塞在网络线程

b) io 操作(read/write)在没有数据到达时是否立刻返回

c) fd 决定了是否阻塞

2. 多路复用以及 epoll

3. epoll_event 与 actor 模型关联

4. 单线程读与多线程写

PS: skynet 实际使用的状态切换来实现的 epoll_wait 后的事件遍历。这里为了在一个循

环中将 skynet 网络功能演示。

九、actor 通信细节

1. skynet.send/skynet.call

2. skynet.redirect

3. skynet.response

4. skynet.ret

【文末福利】:小编整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以私信【1】加群找群主免费领取~更多免费直播技术点击免费即可开始学习C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

相关推荐

程序员都用什么电脑?适合编程笔记本电脑推荐

适合程序员的笔记本电脑首先应该满足小巧轻便这个需求,然后才是性能因素,一个标准的程序员必定能够随时随地改BUG,所以可以优先考虑苹果MacBookPro,由于其MacOS就是Linux内核,做开...

Linux(debian)内核编译(二)虚拟网卡实例

2.10.虚拟网卡TUN/TAP...

老毛子要上天 冬天竟然拿矿机当暖气

2017-12-2814:10:55作者:李鑫我们都知道矿机在实际工作当中会产生出大量的热能,近日俄罗斯就有人用Comino挖矿电脑来充当暖气的效果,这台电脑不需要特别安装,也没有多余的接口,同样...

qemu linux内核(5.10.209)开发环境搭建

版本信息宿主机:ubuntu20.04.6LTS(FocalFossa)虚拟机:ubuntu20.04.6LTS(FocalFossa)安装宿主机的步骤省略,和一般的在vmware中安...

Ubuntu 16.04 LTS现已正式支持IBM LinuxONE与z Systems

4月22号的时候,Canonical很高兴地宣布了Ubuntu16.04LTS(XenialXerus)已正式支持IBMzSystems和LinuxONE大型机的消息。该长期支持版本经历了六...

号称最强大深度学习笔电,雷蛇推出Lambda Tensorbook笔记本电脑

IT之家4月13日消息,深度学习公司Lambda与雷蛇合作,发布了新的LambdaTensorbook笔记本电脑,号称是世界上为深度学习设计的最强大的笔记本电脑,可以使用Linux...

电脑连 WiFi 全攻略!3 步搞定 + 疑难解答

电脑搜不到WiFi?输对密码却连不上?看视频卡、打游戏延迟高?别慌!不管你用Win/Mac还是Linux,这篇保姆级教程从连接步骤到故障排查全覆盖,10分钟让你告别“网络黑洞”!一、基础连...

linux 网卡bond模式

如何进行Linux网络绑定网络绑定简介在Debian10Buster(DHCP)上配置有线和无线网络绑定...

在 Ubuntu Server 上配置静态 IP 地址

Ubuntu17.10之前版本编辑/etc/network/interfaces文件重启网络服务或重启服务器来应用新的配置...

爬虫搞崩网站后,程序员自制“Zip炸弹”反击,6刀服务器成功扛住4.6万请求

...

Linux网络运维脚本实战示例:配置下发

在Linux网络运维场景中,自动化配置下发是提高效率的关键。一个示例展示如何编写一个Shell脚本,用于远程批量部署网络配置到多台服务器。本示例将使用SSH无密码登录和Ansible自动化工具来简化和...

KVM 虚拟机网络连接异常的排查方法

#KVM虚拟机网络连接异常的排查方法当KVM虚拟机出现网络连接问题时,可以按照以下系统化的方法进行排查和解决:##一、基础网络检查###1.检查虚拟机网络状态```bash#在虚拟机内部检...

技术宅教你linux开发板直连电脑ubuntu

1:我使用的是笔记本,台式机类似。原理:和开发板挂载到路由器或者交换机不一样。我们通过笔记本电脑直连,是将笔记本的物理网卡作为一个桥梁,把开发板和虚拟机ubuntu连接在一起。连接好以后可以使用NFS...

Ubuntu 25.04发行版登场:Linux 6.14内核,带来多项技术革新

IT之家4月18日消息,科技媒体linuxiac昨日(4月17日)发布博文,报道称代号为PluckyPuffin的Ubuntu25.04发行版正式上线,搭载最新Linu...

【故障解决】麒麟系统右下角网络图标取消显示叹号

原文链接:【故障解决】麒麟系统右下角网络图标取消显示叹号...

取消回复欢迎 发表评论: