线上bug的解决方案-带来的全新架构设计

发表于:2016-2-14 10:10

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:失足程序员    来源:51Testing软件测试网采编

  缘由
  本人从事游戏开发很多年一直都是游戏服务器端开发。
  因为个人原因吧,一直在小型公司,或者叫创业型团队工作吧。这样的环境下不得不逼迫我需要什么都会,什么做。
  但是自我感觉好像什么都不精通。。。。。
  好了好像偏题了!
  回归正题
  现在公司是做手游开发,java服务器 + U3D做客户端的mmo手游,仿魔兽世界!
  做软件的都知道一个蛋疼的事情,那就是线上Bug。但是做服务的人更清楚另一个蛋疼的事情,就是在线更新,不停服更新。
  知道的人,想想都蛋疼,当然不知道的,那就只能自己想象了。
  线上经常出问题大家都是能理解的。bug肯定是有的。做服务的同僚应该都知道,不到维护的时间是不能停止服务区更新的除非是非常重大的bug。
  这里面游戏服务器更为严格,因为你无故维护,维护一次可能就会流失一批玩家。所以这一直是一个梗。
  本人经过三个星期的研究和测试,最终发现一个可以解决这种一出现bug,却能在线更新,且不影响性能的触发方式。
  通过这样一个方式,主程序,加数据库,通过脚本实现逻辑模块;
  这样就有一个脚本的实现形式,脚本如果实现的不好,那么性能消耗就很大了。
  我的做法是把逻辑部分的方法抽象出来。放到脚本去实现。通过脚本把实现脚本逻辑代码在注册会逻辑模块。
  这样的做法能保证我们有逻辑模块有bug的时候及时的修改逻辑,再次注册脚本已到达热更新效果。保证服务器运行的稳定性。
  我们开始吧。
  首先我要说一下我这里使用的是C#语言作为讲解。java也是一样的道理。
  不在赘述,如果需要代码实现的可以留言!
  这里可能牵涉到我之前的一些文章包含的类容,比如脚本加载器,日志模块,http监听模块。
  我们先创建一个控制台项目叫TestApp
  在新建一个类库项目 TestApp.Scripts
  基本工作已经完成了。
  接下来,我们在TestApp下面新建一个类IMainManager
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7
8 /**
9  *
10  * @author 失足程序员
11  * @Blog http://www.cnblogs.com/ty408/
12  * @mail 492794628@qq.com
13  * @phone 13882122019
14  *
15  */
16 namespace TestApp
17 {
18     /// <summary>
19     ///
20     /// </summary>
21     public interface IMainManagerScript
22     {
23
24          void Test();
25
26     }
27 }
  我们在TestApp下面新建一个类MainManager
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7
8 /**
9  *
10  * @author 失足程序员
11  * @Blog http://www.cnblogs.com/ty408/
12  * @mail 492794628@qq.com
13  * @phone 13882122019
14  *
15  */
16 namespace TestApp
17 {
18     /// <summary>
19     ///
20     /// </summary>
21     public class MainManager : IMainManagerScript
22     {
23
24         public static MainManager instance = new MainManager();
25
26         public static MainManager GetInstance()
27         {
28             return instance;
29         }
30
31         public IMainManagerScript IScript;
32
33         public void Test()
34         {
35             IScript.Test();
36         }
37
38     }
39 }
  接下来我们在TestApp.Scripts 新建一个文件
1 using Net.Sz.Framework.Log;
2 using Net.Sz.Framework.Script;
3 using System;
4 using System.Collections.Generic;
5 using System.Linq;
6 using System.Text;
7 using System.Threading.Tasks;
8
9
10 /**
11  *
12  * @author 失足程序员
13  * @Blog http://www.cnblogs.com/ty408/
14  * @mail 492794628@qq.com
15  * @phone 13882122019
16  *
17  */
18 namespace TestApp.Scripts
19 {
20     /// <summary>
21     ///
22     /// </summary>
23     public class MainManagerScript : BaseScript, IMainManagerScript
24     {
25
26         public void Test()
27         {
28             Logger.Info("我是test");
29         }
30
31         public override void InitScript()
32         {
33             MainManager.GetInstance().IScript = this;
34             Logger.Info("MainManagerScripttest  InitScript");
35         }
36
37     }
38 }
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号