分享下我之前做的服务器框架; 游戏在线最高3万; 物理机I7的3台阿里云分服;性能及其强劲;
框架: 底层基于比较流行的skynet,基础采用c语言,脚本lua,部分服务golang;
Skynet: 是一个基于C跟lua的开源服务端并发框架,这个框架是单进程多线程Actor模型。所以他对于机器的性能压榨是很高的。
特点:
1. 性能: 底层采用了多线程+多luastate+协程, 性能优秀
2. 简单: 采用了actor模型,并发无锁,上层coding无感知
3. 沙盒: 利用多线程中lua coroutine的应付IO密集型的优秀能力; 也用lua沙盒做到了环境的软隔离;
缺点:
未引入分布式的zookeeper协调控制,采用了world的单点模型,容灾性较差,服务发现也比较原始;
前端:
proxy:
代理层; 独立进程部署, 主要由原生的go编写;
用来兼容接收多种socket 以便支持 tcp,udp, websocket;
负责桥梁搭建:
第一条: client->proxy->gate;
第二条: client->proxy->ms service
gate:
网关层; 独立服务, 支持横向扩展,主要是进行client-proxy-gate之间的
连接管理; 与所有game进程直连; 也与ms service的网关相连
逻辑层:
game service:
游戏逻辑服务, 支持横向扩展; 主要是处理基于有状态的相关模块:如战斗,技能,副本等;
ms service:
微服务模块; 抽象出 微服务gate,接收其他服务直连,转发相关消息至微服务集群;
主要分担gate的连接压力,并且分担逻辑方面game service的相关压力
处理模块: 客户端配置获取, 签到, 活动, 小红点, 邮件, 聊天, 工会, 开关等等此类 无状态的逻辑;
world service:
顶层世界服务模块; 与几乎所有的service进行连接;
主要是管理所有的服务,玩家状态等等; 以及做一些广播,组播; 也提供热更的对外接口; 也提供一些简单的业务逻辑: 诸如全服boss等; 会有slave保证高可用;
数据层:
DB service:
数据层; 主要负责与redis进行直连; 也与mysql进行直连;
每个game service会定时将data的更新发送到DB service; ms service 则会根据业务情况决定是否直接找DB service进行数据交换还是 找game service进行数据交换;
redis:
采用了哨兵集群模式,开启 AOF
mysql:
作用有二:
1: 冷备, 回档
2: 提供一些简单的关系型查询;一般是对实时性不敏感的需求;
append data service:
数据记录; 主要是追加模式写数据更新到db的记录; 便于查档,归档;
DB daemon service:
独立进程,进行redis的"脏数据"写入到mysql中,并且写入成功后追加到append data中; 可以配置 以事务和批量的模式进行写入;
辅助层:
rabbit mq:
------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------
底层核心: