-
Notifications
You must be signed in to change notification settings - Fork 45
online checklist
landon edited this page Sep 27, 2019
·
1 revision
- 后端
- 服务器性能相关
- 标准A
- backend 8C16G
- 同时在线5000人,各事务90%响应时间<1秒,各事务成功率>99.9%
- 稳定运行72H,无明显资源不稳定问题(如内存泄露、CPU持续飙高),各事务成功率>99.9%
- 需要关注关键场景如登录、广播业务、多人并发业务(如世界boss)下游戏表现(不能卡顿逻辑线程)
- jvm必备参数
- 标准B
- 明确一组redis和mongo可同时支撑多少组backend
- 明确redis/mongo不同部署方式(如单机/集群)的性能差异、限制(如集群不能使用一些批量处理命令)等
- 连接池相关参数调优#You want a small pool, saturated with threads waiting for connections
- 关注内网带宽和外网带宽是否出现瓶颈,如backend同时执行世界boss、同时执行存储
- 明确估算单服内存峰值(计算单玩家内存)
- 明确redis和mongo业务调优,如redis#pipeline、mongo#bulkOps等
- 内存在线玩家即使未操作也不设置过期,避免数据库操作
- 标准C
- 当游戏系统繁忙时,需在用户登录时给予友好的提示,或设计登录排队系统
- 清楚的定义‘系统繁忙’,如同时在线N人,业务消息队列排队过多等
- 在出现故障后,限制频繁登录,防止出现雪崩#客户端
- 明确关服时间,如大量玩家同时在线,是否会关服失败或者时间过长
- 明确大量玩家同时定时存储的时间,是否会超过定时
- 当游戏系统繁忙时,需在用户登录时给予友好的提示,或设计登录排队系统
- 标准D
- 明确日志不会影响业务性能#异步,耗时的打印如protobuf2json异步
- 关注日志过大引起的磁盘空间问题
- 明确性能监控工具接入先行
- 明确公共global和vms的处理能力(PHP)# 线上一个集群共用一组
- 明确backend非游戏业务性能,不影响业务,如日志收集程序、快照等
- 标准A
- 服务器架构相关
- 避免backend单点(后续优化方向是分布式backend)
- 拆分battle(验算/luajit[内存、错误等]/分布式),某些业务可尝试本地复盘
- 可能的公共业务如聊天等独立出来
- 跨服、匹配、实时PK等独立出来
- backend内部线程模型必须清楚
- 玩家主逻辑单线程(hash/玩家消息队列)
- 玩家与玩家之前数据交互通过线程队列消息投递交互
- 耗时业务必须异步(不能阻塞玩家业务)或者在其他线程池处理,最好支持异步callback模型
- 多人业务处理必须优先保证线程安全,其次性能(避免如锁粒度过大)
- 数据库存储线程必须保证顺序存储,避免覆盖,优先保证存储正确性能,其次性能(如多线程处理)
- 其他业务线程池需要明确知道作用、问题等如调度线程池、io线程池
- ThreadLocal需要仔细检查使用,如其他线程用了threadlocal会报空指针,如A玩家线程修改B玩家数据(用的threadlocal的数据是A)
- 参考原则#Never block the event loop, reduce context-switching
- 避免backend#crash引起5分钟以上的回档
- 性能考虑,建议定时存储(5分钟以内)
- 建议批量存储、增量存储(玩家数据变化才存储)、数据压缩# 保证数据库存储算法准确、性能高
- 可快速处理合服
- redis#key必须要带上serverId,1是因为一组redis是多个backend服务,另外处理合服
- 合服2种(redis/mongo都合、mongo不合)
- vms/global可平行扩容
- redis、mongo扩容需要有明确解决方案
- 多语言版本需无缝迁移
- 必须支持热更新,大部分业务bug均可热更解决,需要明确热更限制(如新增属性、内部类等)、问题(如内存泄露等)
- 必须支持配置表热更、配置热更、开关热更(如日志的开关)等
- 必须支持动态查询或者修改服务器内存的能力(如bsh等)
- 需要有弱网解决方案
- 建议支持动态agent如btrace、jvm-sandbox
- 必须可防外挂(篡改、重发等)、防攻击(防洪水)
- 避免backend单点(后续优化方向是分布式backend)
- 服务器业务设计相关
- 明确防御式编程/契约式编程#The Server is the Man#CodeReview
- 客户端请求参数必须’强校验‘
- 关键逻辑内每个方法都要try/catch,避免一个方法抛出异常影响其他逻辑,如登出各逻辑模块处理、调度各逻辑模块处理#写代码要想’这个方法抛出异常怎么办‘
- 关键逻辑内的null判断,如不能因为日志打印抛空中断业务逻辑#写代码要想’这个地方为null怎么办‘
- 必须要兼容老玩家数据,如上线新功能,老玩家无法登录
- 严格检查循环、递归等业务逻辑,必须时增加’防御式跳出逻辑‘
- 复杂的代码逻辑必须要拆分多个方法、避免大段、冗长的代码
- 资源增减逻辑必须遵循’先扣后加、检查负数、避免溢出‘,必须在代码层面避免’刷资源‘问题
- 非游戏主逻辑(如日志、http上报)问题(异常、超时等)一定不能影响主游戏逻辑
- 线程池的任务一定要try/catch,避免抛出异常线程终止
- 需要清楚的熟悉线程模型,当前代码运行在哪个线程下
- 缓存#redis使用要慎重,规避redis的高CPU占用、慢;要处理过期
- 数据库#mongo#规避频繁的离线玩家数据库数据修改,也不建议直接修改离线玩家数据(GM除外)
- 不能滥用事件系统,监听器必须只监听感兴趣的事件
- 多人业务要注意线程安全问题(加锁、锁粒度、消息队列投递、threadlocal)
- http三方接口必须要处理超时或者异步,避免阻塞主逻辑线程
- sdk
- 确保登录、支付、推送无任何业务、性能问题
- 登录一定要异步或在单独线程池处理
- 登录等相关逻辑’顶号、踢人,重连、token过期‘无明显问题
- 支付逻辑要实现’无丢单 、无刷单,可补单',详细的充值记录‘、解决ios#黑卡、坏单#退单等
- 推送一定不要影响阻塞主逻辑,需要确认是否耗时
- 业务内的唯一id生成算法需要做压测,避免可能的重复#需要检查使用场景
- uid需要做混淆处理
- 明确防御式编程/契约式编程#The Server is the Man#CodeReview
- 服务器Devops相关
- 明确版本管理#分支模型
- master/develop、pre-release、online、features、hotfix
- 明确git操作规范(如熟悉运用merge/stash/cherry-pick等、以及各种最佳实践-changelog...)# 正确的代码提交和合并
- 版本发布
- 停服更新、不停服更新、前端patch/gsp、后端热更、灰度、审核服、混服等(game、battle、global、vms...)# 通用流程
- 自动开服、关服、维护
- 线上正式集群与平台划分#根据channel获取平台
- 有确定的master/pre-release/online测试集群
- 支撑接入
- 日志收集、查询、业务监控
- 运营GM、BI
- 明确版本管理#分支模型
- 运营活动可通过后台配置
- 要有停服公告机制#global服务不能crash,不能stop/restart
- 明确全服回档、个人回档的解决方案和处理办法
- 玩家数据目前数据库存储是压缩,需要明确运营临时需求解决方案(玩家常用字段不压缩、利用BI统计日志查询、单独写工具从库统计#解压,部分需求可bsh内存查询)
- 服务器线上解决方案相关/事故#需要快速发现和解决
- 玩家登录超时(尤其是刚上线开服)
- 玩家卡(如持续转菊花超时)、CPU飚高
- 刷资源(策划配错表、业务逻辑bug)#回档
- 账号登录异常、老玩家无法登录
- 运营临时需求如做一些统计
- OOM-Killer、内存溢出、内存泄露
- 宕机#如宿主机挂了(vms/global/game/battle)
- 机房网络故障
- 数据库故障、磁盘故障
- 快速反应工具(如导号、bsh、监控、客户端直接线上等...)
- 通用buglist、通用checklist、reviewlist
- 外挂
- 洪水攻击
- 服务器性能相关
- 前端
- 性能
- 内存消耗
- 帧率
- CPU占用
- 流量消耗
- 包体
- 弱网处理
- crash率
- 发热
- 耗电
- 适配
- https/ipv6支持
- 安全
- 客户端加密、混淆、无明文
- 客户端外挂#如修改内存
- log无输出敏感信息
- 变速
- 修改时间
- 异常上报#symbol
- 安装包监测
- 接入
- 报错、crash接入如bugly
- 增量、全量、gsp
- 小包、马甲包
- 多语言解决方案
- ios/android审核流程
- 业务
- 不能卡死,如收到服务器大量广播消息
- 不能卡新手引导
- 不能无法点击
- reviewlist
- 如网络层相关check(弱网、重连、切后台、电话...)
- 切后台/锁屏/Home/网络切换
- 性能
- QA
- 版本管理
- 版本发布流程
- 版本记录
- buglist
- checklist
- 客户端性能测试、服务器端压力测试、网络测试、安全测试