一篇文章让你全面了解Skynet基于Actor模式的开源框架
liuian 2024-12-25 14:00 81 浏览
使用多进程解决高并发带来的问题是进程安全锁,框架经常会因为部分代码的报错而导致死锁或内存占用不释放等诸多问题。而使用单进程的服务器框架,通过线程池来做消息轮询和任务执行,能够避开锁带来的诸多问题。
框架的初衷
- 众核时代的并行编程
- 免费的晚餐已经结束了(The Free Lunch Is Over -- Herb Sutter, 2005)
- E5420(2.5GHz 2004) VS E5-2620v3(2.4GHz 2014)
- 我们获得了更多的核心、更多的线程、更大的缓存、更大的带宽。我们得不到更高的主频。
Erlang
- 1998年Erlang开源
- 2006年传入国内C++程序员圈
Erlang China User Group始于2007,现改名为Effective Cloud User Group
- 并行和分布式
Erlang采用的Actor模式使其增长并行处理,错误处理机制和储存管理为分布式服务,Erlang并不擅长存储密集型数值计算。
Actor模式
- 一切都是Actor
一切都是Object?并行的面向对象模式!创建actor/处理消息/发送消息。发送的消息和发送者解耦、异步通讯。
- 没有Actor的语言提供的框架
Akka by Scala、CAF: C++ Actor Framework by C++、Remact.Net by .net
Skynet
- 2010 年想法
- 2011年12月基于Erlang的第一版本实现
- 2012年7月基于C重写
- 2012年8月1日开源发布
- 2014年4月22日 v0.1.0
- 2014年11月28日 v0.9.1
注:想要学习skynet的可以关注+后台私信“skynet”获取视频学习地址,学习内容详见下图
CodeBase
- 5000行C核心代码
消息分发、Actor调度、Timer管理、基于epoll/kqueue的socket库(支持TCP/UDP)
- 1000行C核心服务代码
- 1000行Lua核心库
- 5000行Lua外围库
Redis/MySQL/MongoDB Driver
crypt、sproto、sharedata,etc
- 单进程+可选Lua沙盒
- 可选分布式结构
- MIT License
消息调度模块
异步编程
- coroutine VS callback
- Lua5.2 coroutine的内存开销仅208字节
C线程很难减少栈的内存开销
- coroutine对异常有良好的支持
javascript需要promise模式
- 服用coroutine避免过频的GC
- 远程过程调用RPC
小心异步过程中的状态改变
- 快速失败模式
Actor沙盒
- C模块 动态库*.so
- Lua State != Erlang Process
- Lua 沙盒隔离(30+20K内存占用)
- Lua5.2(Lua JIT 2.0可选)
命令式语言、轻量coroutine、良好的C交互性能
- Lua库+服务
异步socket库、Launcher、DB Driver
- 共享数据(sharedata/STM)
通讯协议
- 进程内消息传递
文本协议(C服务)、自定义序列化库(Lua服务)、内存数据结构(自定义)
- 跨进程消息传递
自定义协议、sproto、google proto buffers、json, etc
- 广播和组播
分布式解决方案
- skynet 支持两种分布式方案
harbor模式用于拓展计算能力的不足、cluster模式提供弹性、可以一起使用
- 如非必要、在一台机器解决
使用cluster做弱关联
- 不做热更新、只做热修复
A/B滚服、定期维护、减少复杂度
MMORPG 服务器性能
MMORPG
- E5-2620v1(2.0 GHz)*2,32G RAM
开启超线程,系统可见24个核心。
- 10K个TCP长连接
- 200人相互面积伤害,延迟在可接受范围。
计算复杂度O(n^2) Lua编写、CPU平均开销0.5%每人,系统上限2400%,<5M RAM/人
- 多核的优势在于处理时间平滑
陌陌争霸
- E5-2420v1 到 E5-2650v3
- 初期压力测试单机20K用户
承载能力随业务复杂而下降,承载能力随核心数增加线性上升。
- 全服峰值接近200K用户
登录操作无明显延迟,对手搜索(全局单点)无明显延迟。
典型手游集群
电信手游集群
- 不按硬件分服
- 玩家在登录处获取令牌
- 玩家登录任意agent池
- 逻辑服处理排行榜
- 根据运营需要在线调整
- 统一使用数据库集群
- 避免单点
调试与优化
- 内建性能分析模块
- Lua模块内建监控协议
- 替换CRT内存管理库(jemalloc)
- 进程内消息传递减少拷贝
- 优化向自身发送的消息
- 合并timer请求
- 高性能要求的服务使用C/C++编写(慎用)
- 为Lua编写C模块:AOI、寻路、组播、公式计算
- 优化登录、找到热点、避免单点
相关推荐
- 2020显卡天梯图10月(2020显卡天梯图极速空间)
-
排行球队名称积分已赛胜平负进球失球净胜球 1?诺维奇城974629107753639 2?沃特福德91462710...
-
- 笔记本电脑无线网络连接(笔记本电脑无线网络连接不上怎么办)
-
一、笔记本电脑怎么连接wifi---win7系统笔记本连接wifi1、要先创建无线网络连接,将鼠标移到Win7的开始菜单,然后点击“控制面板”。2、然后点击“网络和Internet”。3、再打开“网络和共享中心”,这是Win7系统必有的功...
-
2025-12-22 05:55 liuian
- wind数据库(wind数据库官网)
-
先购买wind数据库,安装好wind取得使用权后,按照wind所给提示,输入账户和密码可使用wind数据库。Wind资讯金融终端是一个集实时行情、资料查询、数据浏览、研究分析、新闻资讯为一体的金融数据...
- 如何关闭360家庭防火墙(如果关闭360家庭防火墙)
-
关闭方法如下:1.打开手机360主界面之后,点击“安全防护中心”。2.点击第三列“入口防护”下方的“查看状态”按钮。3.在列出的功能项中找到“局域网防护”,直接点击后面的“关闭”按钮,关闭所有的“局域...
- 笔记本电脑型号配置怎么看(怎么查自己电脑的型号)
-
查电脑的配置和型号方法:方法一:1、右键单击“此电脑”,点击属性2、这里可以看到操作系统,CPU等大致信息3、点击设备管理器4、这里可以查看具体硬件的详细信方法二:1、首先打开电脑上的“控制面板”2、...
- pscs6序列号是什么
-
AdobePhotoshopCS6就二个版本(测试版和正式版)1、AdobePhotoshopCS6是AdobePhotoshop的第13代,是一个较为重大的版本更新。2、Photoshop在前几...
- win7桌面图片怎么设置(win7如何设置桌面图片)
-
1、首先用鼠标右键单击桌面的空白处。然后在弹出的菜单上选择“个性化”选项。这样就弹出了的个性化窗口上能显示看到“桌面背景”按钮。点击它即可。2、继续打开了选择“桌面背景”选项,然后在上面选择你想要设置...
- windows安卓下载(win安卓版)
-
2265安卓网是安全的,2265安卓网成立于2012年初,网站一直努力为各位安卓爱好者提供最新、最全的安卓游戏软件资源下载。经过几个月的努力、和广大安卓用户的支持、2265安卓网截至到2012年6月已...
- 电脑系统网站排行榜(电脑系统网址还有哪些)
-
车架号查询网站:http://www.yiparts.com/vin通过车架号查询车辆信息。新国标电动车一般是15位纯数字的车架号,如175721508069087,1757前四位是企业代码,由企业申...
- 清理磁盘碎片怎么清理(清理磁盘碎片怎么清理不了)
-
清除磁盘碎片的方法是通过使用磁盘清理工具来进行操作。首先,明确结论是清除磁盘碎片可以提高电脑的性能和运行速度。其次,原因是磁盘碎片是指文件在硬盘上存储时被分割成多个碎片,导致读取速度变慢。清除磁盘碎片...
- kms激活win7提示不是vl版(不是vol版无法使用kms激活)
-
1.可以通过KMS激活或者使用激活工具进行激活。2.因为VL版的Windows需要通过企业或者教育机构购买,所以需要使用KMS激活或者激活工具进行激活。3.如果想要更加稳定和安全的激活方式,可以...
- 如何自动释放虚拟内存(自动设置虚拟内存)
-
虚拟内存是计算机系统中的一种机制,它可以将部分硬盘空间作为内存使用,以弥补物理内存不足的情况。虚拟内存中的数据会在物理内存不足时被交换到硬盘上,而当需要访问这些数据时,它们会被再次加载到物理内存中。虚...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
