分享下我之前做的服务器框架;  游戏在线最高3万;  物理机I7的3台阿里云分服;性能及其强劲;

框架: 底层基于比较流行的skynet,基础采用c语言,脚本lua,部分服务golang;

Skynet: 是一个基于C跟lua的开源服务端并发框架,这个框架是单进程多线程Actor模型。所以他对于机器的性能压榨是很高的。

  1. skynet为游戏主逻辑服务;
  1. go微服务作为辅助服务;
  1. ​redis作为直连主数据层;
  1. mysql作为冷备+关系查询;
  1. proxy支持tcp,udp,websocket(支持http和https)
  1. 通信协议Protobuf

特点:

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: 
  1. 作为集群的全局队列用;
  1. 集群所有service(包括slave)都要定时发送心跳/负载等信息到mq
  1. 微服务会定时消费以上的心跳/负载, 进行负载和进程挂掉的判定, 异常时进行广播;
  1. 所有服务会订阅几个关键信息: 择主, 重连, 主备切换, 负载上限
third sdk service: 
第三方sdk服务; 如神策等等:
skynet服务器 --> third sdk service --> 按照json格式写入log文件 --> 提交给神策后台

------------------------------------------------------------------------------------------------------------------------------------------------------------ 

------------------------------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------------------------

底层核心:

  1. skynet是基于事件的高并发消息处理框架。
  1. 事件主要来源: 网络,定时器和信号通知等
  1. 当事件触发时,skynet将这些事件统一编码成消息结构,派发给感兴趣的服务处理;如果当前无事件,可以做到该服务0的CPU消耗
  1. 核心数据结构是 skynet_context :
  1. 并发解决方案: 消息队列:每个服务都有一个消息队列,当队列中有消息时,会主动挂到全局链表。skynet启动了一定数量的工作线程,不断从全局链表取出消息队列,派发消息给服务的回调函数去处理。(在 callback 函数调用回工作线程时,消息队列没有被放回全局队列,其它工作线程没有可能获得这个 callback 函数所属服务的消息队列,所以该服务也就不可能存在并发风险了)

skynet游戏服务器框架分享的更多相关文章

  1. Pomelo分布式游戏服务器框架

    Pomelo介绍&入门 目录 前言&介绍 安装Pomelo 创建项目并启动 创建项目 项目结构说明 启动 测试连接 聊天服务器 新建gate和chat服务器 配置master.json ...

  2. Leaf - 一个由 Go 语言编写的开发效率和执行效率并重的开源游戏服务器框架

    转自:https://toutiao.io/posts/0l7l7n/preview Leaf 游戏服务器框架简介 Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏 ...

  3. 游戏服务器框架:Leaf/go

    Leaf 是一个使用 Go 语言开发的开源游戏服务器框架,注重运行效率并追求极致的开发效率.Leaf 适用于几乎所有的游戏类型.其主要的特性: 良好的使用体验.Leaf 总是尽可能的提供简洁和易用的接 ...

  4. 基于Golang的游戏服务器框架cellnet开发日记(二)

    看官们肯定还有大部分不是很熟悉Actor模型. 我这里基于Erlang, Skynet等语言和框架库来实战型解释下Actor模型.  Actor概念 Actor模型和OO类似, 都是符合人的思维模式进 ...

  5. C# 游戏服务器框架

    http://www.supersocket.net/ http://blog.csdn.net/zhuweisky/article/details/9055989 http://blog.csdn. ...

  6. 使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?(非常稳定、捕获所有异常、非常适合从头开始,但大公司已经有现成的C++框架、所以不会使用)

    使用 Go 语言开发大型 MMORPG 游戏服务器怎么样?和C Socket服务器比起来有什么优劣?可行性怎么样? 从2013年起,经朋友推荐开始用Golang编写游戏登陆服务器, 配合C++做第三方 ...

  7. 深入浅出node.js游戏服务器开发1——基础架构与框架介绍

    2013年04月19日 14:09:37 MJiao 阅读数:4614   深入浅出node.js游戏服务器开发1——基础架构与框架介绍   游戏服务器概述 没开发过游戏的人会觉得游戏服务器是很神秘的 ...

  8. c++游戏服务器编程学习笔记(一)TCP/IP

    1. c++游戏服务器编程c++运行效率非常高2. TCP传输控制协议IP网际协议Socket 3.Linux 乌班图开源第三方库BOOST 4.80%游戏服务器端用C++工作量最大的地方是具体的游戏 ...

  9. abelkhan服务器框架

    abelkhan是一个开源的游戏服务器框架.目标是提供一个稳定.高效.可扩展的服务器框架. github:https://github.com/qianqians/abelkhan 论坛:http:/ ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:QTableWidget项编辑方法editItem、openPersistentEditor

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.触发编辑项的editItem方法 QTableWidget提供了触发项编辑的方法,调用语法如下: ...

  2. 第10.1节 Python的模块及模块导入

    一. 什么是模块 Python中的模块即单个的Python代码文件,为什么称为模块呢?这是因为在Python中,每个独立的Python文件都可以作为被其他代码导入的模块使用,导入的模块有自己的名字空间 ...

  3. 第14.5节 利用浏览器获取的http信息构造Python网页访问的http请求头

    一. 引言 在<第14.3节 使用google浏览器获取网站访问的http信息>和<第14.4节 使用IE浏览器获取网站访问的http信息>中介绍了使用Google浏览器和IE ...

  4. PyQt(Python+Qt)学习随笔:Qt Designer中部件的layoutDirection属性

    layoutDirection属性保存的是部件的布局方向,有三个取值: 在部件上设置布局方向时,它将传播到部件的子级,但不会传播到作为窗口的子级,也不会传播到已显式调用setLayoutDirecti ...

  5. Flutter · Python AI 弹幕播放器来袭

    AI智能弹幕(也称蒙版弹幕):弹幕浮在视频的上方却永远不会挡住人物.起源于哔哩哔哩的web端黑科技,而后分别实现在IOS和Android的app端,如今被用于短视频.直播等媒体行业,用户体验提升显著. ...

  6. 轮廓检测论文解读 | 整体嵌套边缘检测HED | CVPR | 2015

    主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, gr ...

  7. 在iframe中获取另一个iframe中的元素

    $(top.parent.iframeId).contents().find("#selector") //iframeId为iframe的id名称

  8. starsWidth 和endWidth ie不兼容方案

    if (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function (pref ...

  9. 题解 CF1426E - Rock, Paper, Scissors

    一眼题. 第一问很简单吧,就是每个 \(\tt Alice\) 能赢的都尽量让他赢. 第二问很简单吧,就是让 \(\tt Alice\) 输的或平局的尽量多,于是跑个网络最大流.\(1 - 3\) 的 ...

  10. 题解-洛谷P4859 已经没有什么好害怕的了

    洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...