分享下我之前做的服务器框架; 游戏在线最高3万; 物理机I7的3台阿里云分服;性能及其强劲;
框架: 底层基于比较流行的skynet,基础采用c语言,脚本lua,部分服务golang;
Skynet: 是一个基于C跟lua的开源服务端并发框架,这个框架是单进程多线程Actor模型。所以他对于机器的性能压榨是很高的。
- skynet为游戏主逻辑服务;
- go微服务作为辅助服务;
- redis作为直连主数据层;
- mysql作为冷备+关系查询;
- proxy支持tcp,udp,websocket(支持http和https)
- 通信协议Protobuf
特点:
1. 性能: 底层采用了多线程+多luastate+协程, 性能优秀
2. 简单: 采用了actor模型,并发无锁,上层coding无感知
3. 沙盒: 利用多线程中lua coroutine的应付IO密集型的优秀能力; 也用lua沙盒做到了环境的软隔离;
缺点:
未引入分布式的zookeeper协调控制,采用了world的单点模型,容灾性较差,服务发现也比较原始;
前端:
逻辑层:
数据层:
- 作为集群的全局队列用;
- 集群所有service(包括slave)都要定时发送心跳/负载等信息到mq
- 微服务会定时消费以上的心跳/负载, 进行负载和进程挂掉的判定, 异常时进行广播;
- 所有服务会订阅几个关键信息: 择主, 重连, 主备切换, 负载上限
------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------
底层核心:
- skynet是基于事件的高并发消息处理框架。
- 事件主要来源: 网络,定时器和信号通知等
- 当事件触发时,skynet将这些事件统一编码成消息结构,派发给感兴趣的服务处理;如果当前无事件,可以做到该服务0的CPU消耗
- 核心数据结构是 skynet_context :
- 并发解决方案: 消息队列:每个服务都有一个消息队列,当队列中有消息时,会主动挂到全局链表。skynet启动了一定数量的工作线程,不断从全局链表取出消息队列,派发消息给服务的回调函数去处理。(在 callback 函数调用回工作线程时,消息队列没有被放回全局队列,其它工作线程没有可能获得这个 callback 函数所属服务的消息队列,所以该服务也就不可能存在并发风险了)