游戏服务端防御式开发

原创 2017年05月29日 21:04:42

游戏服务端承担着游戏复杂业务逻辑实现,玩家数据持久化等重要作用。作为一个合格的服务端业务狗,我们有必要遵守一些好的防御手段,让自己的代码少踩些坑,或者当出现了bug,能够在第一时间进行抢救。

下边一些开发原则是我的经验总结,欢迎补充,不喜轻喷o(^_^)o

  • 检查玩家请求数据的有效性
不管是做web后端,还是游戏后端开发,我们都要检查客户端请求数据的有效性。举个栗子,假设玩家在商店买了一个道具XX,数量为100。对于上传到服务端的参数,例如所购买的道具id和购买数量,我们需要重点检查购买数量参数。总不能玩家说要买100个,但是玩家的金币只能购买10个,服务端就傻傻地给了玩家100个道具吧!
有经验的程序员总是不厌其烦地告诉新手程序员,必须对传入函数的参数进行有效性检测。类似地,我们也必须对玩家的各种请求参数进行检测。很多外挂工具可以直接模拟游戏上一次发包内容,甚至通过对数据的分析进行参数篡改。所以,我们对于直接处理用户请求消息的逻辑方法,应该进行相关有效性检查。
  • 重视行为日志
策划童鞋的脑洞很活跃,有时一些业务流程性非常强,要达到目标往往需要多个步骤有序地完成。我们做开发的,在面对一些强流程性或者数据比较重要的逻辑,一定不要吝啬留下行为日志。打多点日志,出了问题,即使测试人员无法重现,我们也可以根据日志以及代码逻辑发现问题。
当然,打日志也是有技巧的。由于日志是给开发人员自己调试排错的,我们没必要像写作文一样下笔有神,我们只要打印一些关键的行为字眼以及相关参数值。对于同一个模块,我们最好采用相同的前缀作为关键字。这样,当需要查询的时候,只要输入模块前缀以及玩家id,就能清晰地查看完整的流程行为。
  • 合理使用锁
java的线程同步机制主要靠锁。不合理地使用锁,容易引起死锁。如果出现死锁,一般需要重启服务。如果你把服务搞垮了,就准备扣绩效吧。我们可以通过一些保守的策略,尽量减少发生死锁的可能。
一些比较好的方法有如下:
尽可能使用有超时中断的锁,例如ReentrantLock.tryLock()方法。
尽量避免锁里有锁,有时我们为了细化锁的粒度,采用了在一个锁变量里面再使用另外一个锁变量,这种情况最容易发生死锁了。我们可以直接在最外层代码用一个大锁代替里面多个小锁。有时,为了代码更可控,宁可牺牲一些性能。
  • 在别人的方法里加逻辑,请用try.catch()进行包装
游戏业务其实就是功能的堆砌和业务的修改。很多时候,我们经常需要在别人的模块里面加上自己的业务。这个时候,别忘了将自己的代码写在try.catch里面。这样可以保证,当我们的代码发生异常,不会打断已有的逻辑。
  • 不要在循环内部向客户端推送消息
由于客房端在每一帧拆包的数量是有限的,如果在循环体内向客房端下发消息,会导致客户端拆包速度处理不过来,造成卡顿效果。如果确定需要在循环体内处理业务逻辑,可以把每一次迭代的中间结果收集起来,最后统一发下去。
  • 给自己的功能加个开关
在实现一些自己没什么把握的功能,我们可以在这些模块加个对应的功能开关。这些开关其实就是一个简单的布尔变量,当变量为false的时候,我们就不让代码继续往下跑了,同时告诉玩家,该功能暂时关闭。至于怎么切换开关,可以使用管理工具或修改内存的脚本。
  • 有实现热更新代码的机制
不管是多牛逼的程序员,只要是代码,就有可能出现bug。我们更关心的是,当真的出现bug的时候,能够在不重启服务器的情况下,进行代码修复。代码热更新是一个大的话题,有很多机制可以实现,在这里就不展开了。有兴趣的同学可以参考我一篇文章->手游服务端代码热部署

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【SSH网上商城项目实战14】商城首页UI的设计

前面我们利用EasyUI和SSH搭建好了后台的基本框架,做好了后台的基本功能,包括对商品类别的管理和商品的管理等,这一节我们开始搭建前台页面。 做首页的思路:假设现在商品的业务逻辑都有了,首先我们需要...

Netty网络聊天室之基础网关搭建

基本Netty通信框架开发一个模仿QQ的聊天室。使用Netty作为通信网关,使用JavaFX开发客户端界面,使用Spring作为IOC容器,使用MyBatics支持持久化。本文将着重介绍服务端客户端框...

Spring @Resource、@Autowired、@Qualifier的注解注入及区别

spring2.5提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖。在Java代码中可以使用 @Resource或者@Autowired注解方式来经行注入...
  • Baple
  • Baple
  • 2014-01-05 21:39
  • 94546

【SSH网上商城项目实战15】线程、定时器同步首页数据(类似于CSDN博客定期更新排名)

上一节我们做完了首页UI界面,但是有个问题:如果我在后台添加了一个商品,那么我必须重启一下服务器才能重新同步后台数据,然后刷新首页才能同步数据。这明显不是我们想要的效果,一般这种网上商城首页肯定不是人...

Netty网络聊天室之会话管理

浏览器第一次与服务器建立连接的时候,服务器就会自动为之分配一个Session。在我们的聊天室,也可以使用Session来判断用户是否经过登录验证,保存用户的各种信息,向客户端发送消息。这极大方便了程序...

Spring @Resource注解

@Resource(JSR-250标准注解,推荐使用它来代替Spring专有的@Autowired注解)  Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR-250规...

手游服务端框架之消息线程模型

玩家的消息请求如果放在mina的io线程池进行处理,当业务处理非常耗时,会严重影响io的吞吐量。所以,我们应该另起用于处理业务逻辑的线程池,采用生产者消费者模型,异步处理玩家请求。

手游服务端框架之GM金手指的设计

游戏开发需要一些命令,能够像金山游侠这种软件一样,修改游戏里的玩家或公共服务的数据。在游戏项目里,这些命令统称为GM命令。本文将介绍实现gm系统的一种方式。

手游服务端框架之使用事件驱动模型解决业务高耦合

游戏里经常有这样的业务,当玩家触发某个动作时,有若干与之关联的业务也要一起执行。诸如这样场景,我们选择引入事件驱动模型来帮助我们解决业务代码耦合的问题。本文实现一个工具库,来解决监听器与事件多对多的关...

游戏开发的艰辛历程与升级展望

从第一款游戏《贪吃蛇》开始,到《水果忍者》、《时空猎人》,再到如今风靡全国的《王者荣耀》,手机游戏迎来了百花齐放的繁华时代。怀着对游戏行业的热爱,一批一批游戏开发大军加入了队伍。即使从业道路很艰辛,我...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)