美文网首页
2019游戏项目技术复盘

2019游戏项目技术复盘

作者: landon30 | 来源:发表于2020-01-21 15:55 被阅读0次

    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. 新架构设计支持弹性动态扩展能力和高可用容灾能力

    相关文章

      网友评论

          本文标题:2019游戏项目技术复盘

          本文链接:https://www.haomeiwen.com/subject/mzyezctx.html