分享下我之前做的服务器框架;  游戏在线最高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. Python中定义文档字符串__doc__需要注意格式对齐的处理

    Python中的文档字符串是个很不错的提升代码交付质量.编写文档方便的特征,但是需要注意在使用文档字符串时,将文档字符串标识的引号对必须遵守缩进的规则,否则Python语法检查时会无法通过,而引号内的 ...

  2. PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox增加自定义按钮的方法

    在Qt Designer中可以预先定义标准按钮,相关支持的标准按钮请见<PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的StandardButton ...

  3. [BJDCTF 2nd]Schrödinger && [BJDCTF2020]ZJCTF,不过如此

    [BJDCTF 2nd]Schrödinger 点进题目之后是一堆英文,英语不好就不配打CTF了吗(流泪) 复制这一堆英文去谷歌翻译的时候发现隐藏文字 移除test.php文件,访问test.php ...

  4. 对巡风vulscan的理解

    # coding:utf-8 # 漏洞检测引擎 import urllib2 import thread import time import pymongo import sys import da ...

  5. MySQL存储引擎:MyISAM和InnoDB的区别

    MyISAM和InnoDB的区别 定义 InnoDB:MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎.它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回滚.InnoD ...

  6. react项目引入使用element-react报错

    解决办法 npm i react-hot-loader@next -D

  7. MySQL技术内幕InnoDB存储引擎(二)——InnoDB存储引擎

    1.概述 是一个高性能.高可用.高扩展的存储引擎. 2.InnoDB体系架构 InnoDB存储引擎主要由内存池和后台线程构成. 其中,内存池由许多个内存块组成,作用如下: 维护所有进程和线程需要访问的 ...

  8. (干货)构建镜像之docker commit

    Docker提供了两种构建镜像的方法:docker commit命令喝Dockerfile构建文件. docker commit   不推荐 (1).这是手工构建镜像的方式,容易出错,效率低且可重复性 ...

  9. Redis安装教程及安装报错解决方案(大佬勿喷)

    安装环境:CentOS7 Redis版本:redis-6.0.9.tar.gz 依次按照以下顺序执行: 1. [root@localhost ~]# wget https://download.red ...

  10. Java 一行代码 数组遍历输出

    Arrays.stream(arr).forEach(num -> System.out.println(num));