游戏服务器 – 概述

游戏服务器 – 概述

什么是游戏服务器

首先来明确几个概念

  • 游戏服务
    • 从游戏玩家之间的交互形态出发
      • 单机游戏
      • 联网游戏。在同一个局域网内,以一台机器做主机,其他的机器连上这个主机
      • 网络游戏 一般服务器表现不好的时候,会被说你们用的是什么小霸王服务器,卡的跑不到。
  • 游戏服务的基本职能
    • 网络连接
    • 数据存取
    • 逻辑计算
    • 状态保持:上下文、内部驱动等等。
  • 是一个硬件的概念
    • 常见的种类:机架式服务器、刀片机、小型机
    • 会根据游戏类型运行程序的不同,在cpu、内存、磁盘上有所侧重
  • 从游戏交互形态,看游戏开发分工
    游戏交互状态 开发者分工
    单机游戏 图形程序员 + 游戏逻辑程序员
    联网游戏 游戏程序员 + 网络程序员
    网络游戏 游戏前端开发 + 游戏后段开发

游戏服务器的特点及应对

满足海量游戏用户的稳定和高质量服务需求

  • 海量 ,十万、百万、千万级同时在线,最高达亿级注册量
  • 稳定 ,相对于:宕机、网络、计算卡顿
  • 高质量 , 快速:网络延迟、逻辑严谨、更新频率、及时性

游戏服务与其他互联网服务的区别

  • 延迟敏感
    • 实时交互游戏,一般需要网络延迟在300ms以内,才能保证体验
  • 实时的高强度交互
    • 单个终端高频发送请求
    • 单次请求引发多处数据变化
  • 业务逻辑复杂,内部耦合度高
    • 延迟敏感 + 高强度交互同时作用下,【状态维护】往往成为必须
    • 复杂游戏服务的实现代码,可达百万行量级
  • 变更频度高,幅度大
    • 变更幅度,包括内容和逻辑
  • 前后端程序区别
    前端 后端
    程序运行环境 共享 独占
    任务类型 单一任务 大量并发任务
    运行时间 暂态、一次运行 7*24小时,持续运行
    • 独占意味着,拥有所有资源的控制权,重视资源的合理使用而不是最少使用
    • 大量并发任务意味着,性能与可伸缩性
      • 性能来自于:
        • 算法选择与算法优化
          • 排序、查找、空间-时间
        • 操作系统/ 应用程序运行机制
          • IO多路复用
          • 局部性原理
          • 编程语言
        • 硬件
          • CPU充分利用
          • 存储层级的理解与利用
          • 多队列网卡
      • 可伸缩性
        • 测试期间和正式上线的用户至少可以差2个数量级
        注册人数 在线人数 测试周期
        技术测试 1000 ~ 5000 500 ~ 2000 1 ~ 2周
        封闭测试 10,000 ~ 100,000 5000 ~ 30,000 1 ~ 2月
        公开测试 1,000,000 ~ 10,000,000 + 100,000 ~ 1,000,000 n/a
        • 要求系统具备高度扩展性
        • 扩展方式
          • 水平扩展(scale out),可以理解为变多,以前用一套环境,现在用多套环境
          • 垂直扩展(scale up),可以理解为变高,原来是用一个2g hz的cpu,现在来一块4g hz的。
          • 基于扩展幅度需求和成本考虑,互联网服务中一般使用前者
    • 持续运行
      • 稳定最重要
        • 服务稳定包含的因素
          • 避免程序异常终止
          • 持续高效的运算与通信
        • 如何才能稳定?
          • 系统设计,尽量简单,遵循kiss原则
          • 开发构建,充分测试,快速更新
          • 上线部署,架构合理,监控警告
          • 运行时,容灾荣错
      • 容错
        • 错误不可避免
          • 逻辑自身bug,与测试多多配合,做覆盖性测试。
          • 程序运行环境问题:硬件、网络
          • 外部影响 :电力、散热、人为因素、自然灾害
        • 基本需求,错误范围可控
          • 一个用户的错误,不要传染给其他用户
          • 非核心功能的失效,不要导致整个系统失效
        • 基本应对,错误隔离和可快速恢复
          • 程序快速恢复运行
          • 服务冗余和备份策略:冷备、热备、异地备份
      • 日志和监控
        • 充分的日志可以在出现问题时,回溯与重建现场,帮助查明问题
        • 程序运行日志 + 业务内容日志
        • 没有监控就没有对整体服务状况的了解,也无法及时应对问题
        • 全方位、多层次覆盖
        • 避免无效警告
    • 游戏服务器开发方法论
      • 本质上是应对海量服务的问题
      • 出发点:两种不同的困难
        • 事情本身逻辑简单,但是并发规模非常大
        • 事情本身逻辑复杂,要经历复杂的处理步骤
      • 方法论 ,分治:
        • 大的问题分解成小问题,小问题继续分解,最终在合适的粒度得到解决。
          • 服务分布化:接入 – 逻辑 – 存储
          • 通用服务,微服务
          • 内部复杂度应对:分层分块
      • 方法论 , 灰度:
        • 抛弃0/1思维
        • 在不同场景下提供不同服务
        • 在不同范畴维度的应用
          • 服务降级,一个服务不可用时,可以先保证重要的用户,他们的服务是可用的,让一般的用户先等下
          • 灰度发布,如qq,先提供的一些服务,可以先根据号段发布一些服务,可以让老用户先体验或者vip客户 – -!
    • 游戏服务器的相关参与者
      • 开发者:服务器程序员
      • 开发伙伴:客户端程序、游戏策划
      • 构建-测试:测试工程师
      • 部署维护: 运维工程师

游戏服务器开发技术

技术介绍,如下图:

  • 算法
    • 了解常见查找、排序算法的特点。利用算法来改善性能,胜于通过编译器选型、编程技巧。
    • 根据业务情况合理的选择算法。尽量选用复杂度<=0(NlogN)的算法
  • 系统层面,对操作系统基础的理解
    • 处理器管理
    • 进程管理
    • 线程调度
    • 内存管理
    • io管理
    • 权限管理 等等…
  • 对linux操作系统的了解
    • 内核
    • 用户管理
    • 进程、线程
    • 进程间通信
    • 网络
    • 信号处理
    • 权限
  • 开发工具
    • 对编译器gcc的了解
    • 对调试器gdb的了解
    • 对文档工具ar的了解
    • 对autotools的了解
    • 对Makefile的了解
    • 对性能分析工具的了解
    • 对内存泄漏调试工具了解
    • 对samba文件共享的了解
    • 对版本管理工具的了解
  • 语言
    • 选择编程语言的几个要素
      • 业务复杂度
      • 执行效率 vs 开发效率
      • 开发人员和团队能力
    • shell 脚本语言
      • linux 下的程序开发,学会使用shell脚本会大大的提高工作效率
      • 一些工作适合用shell来完成,开发效率更快
      • shell脚本常常被用来做一些集成的工作
    • 程序内嵌脚本语言
      • 了解脚本(解释性语言)的优缺点
      • 脚本在游戏开发中的适用范围
      • Lua/Python/自定义脚本语言
  • 软件设计技巧
    • 化繁为简,区分”变化性”是其中的关键
    • 设计原则 – SOLID
      • 单一责任原则 Signle Responsibility Principle
      • 开放 – 封闭原则 Open Closed Principle
      • 里氏替换原则 Liskov Substitution Principle
      • 依赖倒置原则 Denpendency Inversion Principle
      • 接口分离原则 Interface Segregation Principle
    • 设计模式,可视为设计原则的应用
  • Linux下常用工具
    • 系统管理工具:ipcs/ps/top…
    • 文件系统工具:ls/find/where/which
    • 文本处理工具:sed/grep
    • 性能检测工具:istat/memstat
    • ssh工具:ssh/ssh2/sshd/ssh2d/scp/…
  • 关系型数据库
    • 对数据库的了解
    • 常见DBMS:Mysql
      • 了解mysql的安装和简单管理
      • 了解mysql的性能调优方法
      • 了解mysql的复制
      • 了解mysql的备份和恢复
    • 对sql语言的了解及使用
    • 对数据库表结结构设计的了解
  • NoSQL
    • KV型的数据存储方式
    • CAP & BASE
    • Redis & MongoDB
  • 网络接入、协议
    • 了解TCP/UDP协议
    • 了解Http协议
    • 底层网络编程接口:BSD SOCKET
    • 网络多路处理机制:signal/select/poll/epoll
    • C10K ~ C1000K
    • Google protobuf

参考资料

上面的总结,参考于腾讯游戏学院,附上链接:https://gameinstitute.qq.com/course, 后续的几篇也是参考于此,不再赘述。 整个课程看过一遍,课程经过精心准备,通过游戏服务器真实场景讲叙课程大纲,技术点讲的十分清晰,也有可信力。有些知识点,通过视频回退去看,十分麻烦。在网上搜过这组课程的ppt,没有找到,于是自己记录一下,方便日后查阅。

JackLei
JackLei

我是真的不会修电脑