最近玩全民英雄,然后遇到一个bug,导致我一个账号卡死,不得不重玩新号。bug如下:
-------------------------------------------------

问题 
-------------------------------------------------
 在一个装备合成的引导,我点了合成,接着刚好断网,然后重连网络的时候发现合成的材料消失,可是依然处于合成的引导。这时候显然已经没法合成,而引导又是强制性的,因此没办法往下玩了。
------------------------------------------------- 
猜测前端流程:
-------------------------------------------------  
一开始,我猜测:可能是请求合成的时候前端自己移除了前端内存中的合成材料。而因为断网了,合成请求没发出,结果导致前端没材料,而引导却还没完成。
这个怎么验证呢?退出程序,重新登录。甚至改成换ipad玩都不行。因此并不只是前端移除了数据那么简单,材料在后端确实已经没了!
那么,我又想到了另一种可能:
他的合成和引导接口是分开的独立接口。怎么说呢?

-------------------------------------------------

猜测前端流程:
-------------------------------------------------  
1、前端登录
2、收到当前引导到第几步,是否完成该步骤,是则执行3(不讨论否的情况)
3、发现有引导步骤没完成,则执行引导
4、玩家点击请求执行引导的功能
5、前端收到合成结果
6、前端判断当前是否有相关引导,是则执行7(不讨论否的情况)
7、前端请求后端记录新的引导状态
乍一看好像没啥问题,但实际你会很容易发现,其实在5、6、7任何一步出错或断网。都会导致扣了材料还没完成引导。

------------------------------------------------- 
类似例子
-------------------------------------------------  

这个问题其实我把它归类为“带状态的接口调用”,即一个接口的请求需要依赖上一个请求的接口。这种接口的设计很容易出bug,服务端应该记录好每个接口的状态,甚至对一些请求的状态做持久化。举个极端点的例子,不过这个例子比较明显,一般没人这么做!
比如:以普通RPG中合成神器为例,假设合成需要选择2个材料, 然后点击合成。如果这么设计这个接口:
1、当玩家选择第一个材料的时候,请求后端, 后端扣除并记录当前材料
2、当玩家选择第二个材料的时候,请求后端,后端扣除并记录当前材料
3、当玩家点击合成时,后端根据前面记录的两个材料 生成一个新装备给玩家
因为这个错误实在太明显,导致大家不会那么做。而其实这个问题和前面《全名英雄》的处理本质是一样的。只要断网,而后端没做好第1、2步请求的状态持久化,那么材料必定丢失。(如果有记录玩家选过那两个材料,那玩家还能继续点击合成直接第三个接口,而不至于材料被扣除却没合成)

------------------------------------------------- 
简陋的解决方案
-------------------------------------------------  

回到《全民英雄》那个例子,既然现在玩家是因为先请求和合成,成功合成装备并扣除了材料,然后断网才没请求到记录引导状态。那能不能换个顺序:玩家点击合成之后,先请求记录引导状态再请求合成。这样它如果中间出现断网,顶多就是下次连接的时候引导不见了,但不至于材料被扣除,也不会导致卡死在引导界面(因为更新引导状态已经请求过了,重新连接会获得下一步引导的状态)。这样确实是解决了BUG,但是这样玩家就缺少了一次引导,解决的也不是很彻底。

------------------------------------------------- 
完善的解决方案
-------------------------------------------------  

我们回想一下,刚刚说的 “带状态的接口调用”,即一个接口的请求需要依赖上一个请求的接口。那其实,如果只请求一个独立接口,就不会有这种问题。那请求的应该是合成接口呢,还是引导接口呢?
个人认为,请求合成接口更合适。因为后端本来就有合成接口,只需要后端在合成的时候派发一个事件出去,让引导模块捕获这个事件,然后重置自己的引导状态就可以。这样还省一个接口请求,还节省你流量,多贴心啊!

欢迎大家讨论!

从bug看《全民英雄》的接口设计相关推荐

  1. 优秀的API接口设计原则及方法

    一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的.如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的 ...

  2. “淘宝” 开放平台接口设计思路

    最近对接的开放平台有点多,像淘宝.京东.快手.抖音等电商平台的开放平台基本对接了个遍,什么是CRUD BODY也许就是这样的吧!!! 虽然对接各大开放平台没啥技术含量,但咱也得学点东西不是,不能白对接 ...

  3. 总结常见的违背Rest原则的接口设计做法

    此文已由作者郑华斌授权网易云社区发布. REST这词我们常常挂在嘴边,比如"开发一个rest接口",又比如Spring项目的代码: @RestControllerpublic cl ...

  4. 腾讯技术分享:微服务接口设计原则

    来源|腾讯技术工程(ID:Tencent_TEG) 本文结合自身后台开发经验,从高可用.高性能.易维护和低风险(安全)角度出发,尝试总结业界常见微服务接口设计原则,帮助大家设计出优秀的微服务. 1.前 ...

  5. php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

    2016年12月29日13:45:27  关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是restf ...

  6. 接口设计,这36个核心知识点一定要注意

    目录 前言 设计好接口的 36 个锦囊 总结 前言 作为后端开发,不管是什么语言,Java.Go 还是 C++,其背后的后端思想都是类似的.我们做后端开发工程师,主要工作就是:如何把一个接口设计好.所 ...

  7. 聊聊接口设计的36个小技巧

    前言 大家好,作为后端开发,不管是什么语言,Java.Go还是C++,其背后的后端思想都是类似的.后面打算出一个后端思想的技术专栏,主要包括后端的一些设计.或者后端规范相关的,希望对大家日常工作有帮助 ...

  8. 像科学家一样思考python答案_像计算机科学家一样思考python-第4章 案例研究:接口设计...

    系统环境 ubuntu18 4.1turtle模块 模块一开始导入turtle模块就报错了 1 Python 3.6.5 (default, Apr 1 2018, 05:46:30)2 [GCC 7 ...

  9. 36 个接口设计,是真的好用

    作为后端开发,不管是什么语言,Java.Go还是C++,其背后的后端思想都是类似的.后端开发工程师,主要工作就是:如何把一个接口设计好.所以,今天就给大家介绍,设计好接口的36个锦囊. 1. 接口参数 ...

最新文章

  1. gpu处理信号_在PyTorch中使用DistributedDataParallel进行多GPU分布式模型训练
  2. TF之NN:利用神经网络系统自动学习散点(二次函数+noise+优化修正)输出结果可视化(matplotlib动态演示)
  3. java类似goto_原来java中也有类似goto语句的标签啊--java label标签
  4. 用计算机进行有理数计算时,鲁教版六上2.11《用计算器进行有理数的计算》word学案.doc...
  5. 201521123078 《Java程序设计》第6周学习总结
  6. opencv入门课程:彩色图像灰度化和二值化(采用skimage库和opencv库两种方法)
  7. python实现采样函数_python中resample函数实现重采样和降采样代码
  8. Maven学习总结(56)—— Maven、Gradle 、 Ant 哪一个构建工具最适合你?
  9. 中心对称又是轴对称的图形_【笔记-公务员amp;事业单位】行测:图形推理
  10. 第三节基础篇—SQL的约束
  11. Hive多用户模式搭建
  12. 【TSP】基于matlab模拟退火算法求解旅行商问题【含Matlab源码 1129期】
  13. PDF417数据容量
  14. 微信支付商户平台可以绑定多个不同主体的小程序或微信公众号
  15. 机器人读懂人心的九大模型
  16. FLASH连连看算法分析及源代码
  17. 游戏加加:科学的算法+公平的引擎=最真实的BenchMark
  18. Java实现Google的S2算法工具类
  19. 微信小程序开发—— tabbar 配置
  20. 随机地图生成--自己的一次尝试

热门文章

  1. 防火墙阻止tftp_防火墙TFTP协议处理流程及TFTP ALG应用
  2. BZOj 3208 食物 生成函数+广义二项式定理
  3. ZILLIZ携手NVIDIA,参展2019中国移动全球合作伙伴大会
  4. 利用graphics.h实现粗糙CAD
  5. 手机摄像头产业竞争格局趋势深度解读
  6. 一张图看懂java 堆和栈
  7. 【Matlab】判断矩阵是否正定
  8. 十八:责任链模式:优雅的任务分派
  9. 机动车驾驶培训学校驾校类完整网站织梦模板(带手机端)
  10. SAP事务码开关控制,TCODE