Skip to content

2019 tech review

landon edited this page Jan 21, 2020 · 1 revision

2019游戏项目技术复盘

线上问题复盘

一、外部服务不可抗拒因素(多次)

  • 现象

    • 机房故障如风扇问题导致关机

    • 金山云故障如升级网卡驱动热迁移导致cpu高

    • 腾讯云服务器宕机、腾讯上海光纤受损(影响安卓应用宝平台)

    • 腾讯CDN挂了(影响版本更新)

    • 亚马逊服务器宕机(影响部分海外服务)

  • 复盘

    • 外部机房服务宕机不可避免,项目、运维这边都要做好预案,如数据库分开部署等,以在宕机时损失达到最小

二、线上刷资源bug(多次)

  • 现象

    • 策划配置错误、redis超时导致奖励重发、三方活动漏洞刷

    • 代码动态修改了配置表奖励、排行榜重复出现同一个人(跳表)导致同一个人收到多封邮件

    • 补偿脚本循环bug导致多发、策划将测试数据提交了、运营补偿发错道具

    • SDK被刷订单(跨月未做排重)、领奖相关逻辑业务抛出异常导致刷、购买逻辑发一个很大的正数/负数导致

    • 整数溢出变为负数导致逻辑bug、奖励领取状态字段未存库导致反复领取

  • 影响主要项目

    所有项目

  • 复盘

    后端业务逻辑明确防御式编程:The Server is the man

    • 客户端请求参数强校验
    • 关键逻辑内方法都要try/catch,避免一个方法抛出异常,影响其他方法
    • 资源增减逻辑必须遵循’先扣后加、检查负数、避免溢出‘,必须在代码层面避免’刷资源‘问题
    • 关键逻辑内的null判断,如不能因为日志打印抛空中断业务逻辑
    • 目前Java redis底层捕获了异常,业务层无感知,相关项目需注意此问题避免返回默认值造成逻辑bug
    • 整数计算时一定要考虑溢出问题

    排序集合如ConcurrentSkipListSet或者TreeSet,在元素添加后,再尝试改变某元素内部用于排序的值后,则出现无法remove的情况,需要注意此问题

    对于策划、运营配错/发错等问题则需要从流程上规避,如增加多次确认等

    刷资源的原因通常很小,但是影响巨大,很有可能要回档,所以无论是策划、程序、运营都要有checklist

三、 多线程

  1. ThreadLocal

    • 现象

      数据错乱、串号等,出现场景如充值回调、battle回调到玩家线程时拿到错误了threadlocal数据

    • 复盘

      • 使用ThreadLocal一定要谨慎,本身是一个好东西,但是在多线程交互的时候一定要多注意
  2. 多线程

    • 现象
      • 腾讯系游戏聊天多线程调用SDK导致进程crash(jni)
      • LinkedHashMap + ReentrantReadWriteLock 实现LRUCache导致登录卡死
      • HashMap死循环(排行榜、活动)、key重复导致无法登录
      • 客户端sdk回调多线程操作lua_state闪退、多线程异步加载spine闪退
      • 战斗异步callback的上下文 + 重连卡死
    • 复盘
      • HashMap是非线程安全,多线程环境下一定要注意
      • 客户端使用多线程要注意,会出现crash
      • 引入battleserver后,backend逻辑线程调用battle后会直接返回,如果此时battle耗时,那么转菊花下线后重连进来要考虑回调发送的消息上下文问题

四、 Battle

  • 现象

    • battleserver复盘时间长、Crash、内存占用过高

    • 内存泄露、死循环、luajit table 65535、响应时间长

    • 战斗逻辑bug

  • 复盘

    • 避免多线程调用同一个luastate

    • 服务器端复盘可关闭luajit模式

    • 战报JSON解析优化、luastate配置合理、频繁GC影响复盘、预热

    • luajit32位内存限制,避免多版本造成luastate泄露,可考虑luajit64位

    • 战斗逻辑复杂,最好有战斗模拟器工具模拟所有组合情况,避免线上出现bug

五、Devops

  • 现象

    • 腾讯运维操作合服/新服失误、集团运维操作失误如迁移、项目运维操作失误如删库
    • 更新https证书导致cdk接口不可用、cdk生成过慢、cdk失败因在执行删除过期码导致数据库压力过大、cdk地址更新未及时通知项目组
    • 版本更新发布时间长、版本更新流程规范如在某些情况下建议整包(hotfix、hotfix config后)、patch上传优化
    • ES集群Crash、Python脚本性能问题
    • redis集群/单例方式注意事项、redis清理过期key、keys *、单文档大小超过16M
  • 影响主要项目

    • 所有项目
  • 复盘

    • 运维工作必须要严格按照规范和checklist走

    • 版本发布的基础组件,不能出问题

    • 运维脚本、三方中间件都要严格测试

    • cdkey、gm等系统也要保证服务,否则也会对项目组产生影响

国内、海外上线项目优化、问题

  • 优化

    内存(泄露、大量离线Player、空间换时间)

    CPU(只处理感兴趣的事件、避免频繁操作redis)

    日志(异步、无用日志)

    JVM(版本升级、cms gc优化)

    数据库存储(算法优化、带宽/CPU平滑)

    mongo(副本集切换、writeconcern、传输压缩)

    使用db做数据库表

    资源多线程加载

    帧率根据机型适配

    天眼接入

    拆玩家登录消息

  • 上线问题

    • 刷号、网络攻击、加速、IOS充值延迟到账

    • 数据库文件损坏、热更crash、越狱设备修改游戏

    • ios审核问题、UC渠道屏蔽字、sdk bug(使用最新sdk)

    • 海外:移动网络无法连接服务器

    • 其他时间问题

      • 跨年
      • quartz调度误差
      • 线程定时任务偶尔会运行时间不对

iOS审核相关

  • sdk使用一些非法接口
  • 苹果提审将拒绝使用WebView,使用WKWebView
  • 审核人员vpn连不上游戏

客户端相关

  • Android 64位支持
  • android可以考虑用FireBase推送

landon 2019语录

  1. 线上项目,出现bug正常,只要不是刷资源的bug
  2. 防御式编程 + 契约式编程 = The Server is the Man
  3. 最无奈的问题就是反复出现,重复踩坑
  4. 友商不给力的时候,你一定要坚挺

2020展望

  1. 异步编程

    • callback、future、reactive、coroutine
  2. 新架构设计支持弹性动态扩展能力和高可用容灾能力

Clone this wiki locally