线上bug的缓解方案–带来的崭新架构设计美高梅4688.com

互联网产品成长三部曲

您先会想要使用它,然后您会需要它,最终大家会变得离不开它 –
就像一个融入到人们通常生活中的到处可见的实用工具一样。

当下非死不可开发者大会F8正在隆重的拓展中,规模相当庞大。但自身现在想的却是该公司在启动时的动静。Facebook应该是首先个(依据网络所能查到的消息)打造了一个增长型团队的商店。并从未什么样参数数据声明该团队会丰富高效的获取可持续发展的用户增长。人们频繁忘记的是,在关心用户增长此前,Facebook已经达标了Marc
安德烈(Andre)essen所说的“产品市场卓殊“了,所谓产品市场非常说的就是:

“处于一个完美的商海中并带来一个满意该市场的产品“。

骨子里环球每篇有关用户增长的随笔都应该附上下边的这句免责声明:

若是没有达标产品市场异常的话,你产品的顾客是不容许赢得增长的。

价值观的市值主张关注解决一个“问题“或者“需要完成的职责“,但这种轻描淡写而谈是遥远不够的。你需要对一个如实的您觉得这个世界需要的成品举办剖析。你将会关切,测试,和剖析并最后汇总观测别人是什么打造一个优异的出品和铭记的用户体验的。人们频繁会忘记产品体验是来自用户的情丝需要以此实际。

您的用户实际在消费的是一种体验。那么你是何许声明这种感受,如何提议问题并汇总考虑相关音信的吧?

自己本人非凡赏心悦目曾经踏足过打造Facebook应用和游戏,其他手游,以及消费型移动使用,并且切肉体会和考察过它们的用户的增高。依据这一个经验,我表达了一套框架来叙述互联网产品的感受以及其所急需经验的不同等级。

**总的来说就是两个阶段:互联网产品从用户的“想要“开端,然后到“需要“。而最后一个品级往往很多成品都达不到的,这就是

  • 该产品提升成一个融入到人们平日生活以及任何产品中的实用工具了。**

美高梅4688.com 1

产品成长三步曲

想要 — 解决一个奇异的且令人感到很风尚的中坚价值主张
需要 — 人们觉得离不开它且不停的回来向你索取更多
到处的工具 — 它变成其它产品的一个效率

那多少个正在急速增长的互联网产品必定已经经历过上述的五个级次了,同时这么些还在途中的产品必然就会落在这两个等级的中间之一上边。非死不可其实就是一度经历过那么些等级且富有飞跃的用户增长的很好的示范。

美高梅4688.com 2

Facebook

马克Zuckerberg在非死不可初期的一个视频很好的解析了让非死不可最后提高成一个融入人们生存和当作其他产品的实用工具的想法。

想要

先前时期非死不可在2004年十二月份起头上线,且在多少个礼拜内三分之二的院校的学童都在上头举办挂号。

Facebook允许高校学生查看它们学校的”面书“而改为一个用户“想要“的成品。它们现身在学生面前的时候高校早已存在了安定的名单音讯,而去查看同学的音信这一个需要却是一直留存但不曾被满足的。Facebook将这种需求变成现实的一个劳务来让大家能够一本万利的浏览其别人的档案,并允许用户在下边添加一些该校花名册之外的简单名额的另外朋友进入。

需要

本身以为非死不可其实就是个在线的大学名单。
做一些另类的且很酷的事物是必须关注的职责,但从不必要在此之外做更多其他业务了。

从该早期视频的这段话看来,其实成立非死不可的这班人开首并从未理想把意见来看学校之外。Facebook通过中度关切提供一个给高校学员使用的产品而改为学生们的必需品。一个让Facebook加速穿过这一个阶段的重要效用是在二零零五年的1二月份加进去的,那就是同意用户在非死不可上给他俩的情人的照片举行加标签的职能。有了该意义后,大学的学员登时对Facebook着了魔。

所在的工具

些微级其余劳务大家本可以提供但因身在北大而又无法提供给拥有学员用户。也有一些级此外服务是我们作为一个高校网络向任何品种的制品转变所不能够提供的。

二零零六年11月,距离非死不可在新加坡国立第一次公布大概2年半的时日,非死不可将该产品对所有人举行开放。这就是非死不可成为一个“无所不在的工具“的始发。事实上,两年过后,在非死不可工作的同僚们都把非死不可叫做“社交工具“。

万一一个互联网产品成为一个工具之后,你频繁会在此外产品的身上看到它的身形。因为该产品所鼓励的所作所为艺术已经改为了一种文化,所以这个产品在众人的平常生活中已经是坚实的了。

Facebook进一步的工具化之路应该归功于其往平台化的大势提高的主宰及其执行力,这多少个转变让开发人员可以很有益的把非死不可集成到他俩开发的利用上去。Facebook并没有坐等其他产品去拷贝它的效益:它让非死不可和其他产品的三合一变得至极的简约,并因而在这一个过程中得到最大的利益。

以此咱们想想国内的QQ,
微信,网易,其实他们都已经经历过这三步了。就像您看完这篇著作之后,你就会很便利的通过下边的转化效能把它转化到您的QQ空间,网易,微信朋友圈等一样。v

那么遵照地点给出的模子,你以为你正在全力的制品又是高居哪一个等级之中呢?

<完>


版权:本随笔使用[行文共用署名3.0神州陆上版许可证],
若非授权,转发时切勿删除以下联系消息,否则追究相应责任。

注:如若您喜爱本文的话,欢迎关注世界会邯郸分舵以及专题《人们都是创业者


有读者认为本文没有提交原文链接,其实下面作者的官网中的随笔已经有了,这里再一次再付出三次,本文来源:
http://techgogogo.com/2015/03/%E4%BA%A7%E5%93%81%E6%88%90%E9%95%BF%E4%B8%89%E6%AD%A5%E6%9B%B2-%E6%9D%A5%E6%B5%8B%E8%AF%95%E4%B8%8B%E4%BD%A0%E7%9A%84%E4%BA%A7%E5%93%81%E5%A4%84%E5%9C%A8%E5%93%AA%E4%B8%80%E6%AD%A5%EF%BC%9F/
而该来源又是编译自:
https://medium.com/backchannel/lessons-learned-growing-consumer-products-550fc04c63c2

缘由

本身从事游戏开发很多年直接都是游玩服务器端开发。

因为个人原因吧,一直在小型集团,或者叫创业型团队工作啊。这样的条件下不得不逼迫自己急需咋样都会,什么做。

唯独自我感觉好像什么都不了解。。。。。

好了近似偏题了!

回归正题

前几天铺面是做手游开发,java服务器 + U3D做客户端的mmo手游,仿魔兽世界!

做软件的都晓得一个蛋疼的业务,那就是线上Bug。可是做劳动的人更精晓另一个蛋疼的事务,就是在线更新,不停服更新。

精通的人,想想都蛋疼,当然不清楚的,那就不得不协调想象了。

美高梅4688.com 3

 

线上不时出问题我们都是能精晓的。bug肯定是部分。做服务的同僚应该都掌握,不到维护的时日是不可以止住服务区更新的只有是这个重要的bug。

这之中游戏服务器更为严刻,因为你无故维护,维护两回可能就会消亡一批玩家。所以这直接是一个梗。

自己经过五个礼拜的探讨和测试,最后发现一个足以解决那种一出现bug,却能在线更新,且不影响属性的触及模式。

美高梅4688.com 4

经过如此一个艺术,主程序,加数据库,通过脚本实现逻辑模块;

这样就有一个本子的兑现形式,脚本即便实现的不好,那么性能消耗就很大了。

本人的做法是把逻辑部分的法子抽象出来。放到脚本去实现。通过脚本把贯彻脚本逻辑代码在注册会逻辑模块。

如此这般的做法能确保大家有逻辑模块有bug的时候立刻的改动逻辑,再度报了名脚本已到达热更新效果。保证服务器运行的安静。

俺们起头吧。

首先我要说一下我这里使用的是C#语言作为讲解。java也是一样的道理。
不在赘述,如果需要代码实现的可以留言!
这里可能牵涉到我之前的一些文章包含的类容,比如脚本加载器,日志模块,http监听模块。

咱俩先创制一个控制台项目叫TestApp

在新建一个类库项目 TestApp.Scripts

美高梅4688.com 5

基本工作一度完结了。

 

接下来,我们在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 }

美高梅4688.com 6美高梅4688.com 7

 1 using Net.Sz.Framework.Log;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 
 8 namespace TestApp
 9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             //Logger.LOGCONSOLE = true;//不在控制台打印信息
15             //Logger.LOGLEVEL = Logger.ENUM_LOGLEVEL.INFO;//不显示debug消息
16             Logger.Info("==================Start============================");
17 
18             Net.Sz.Framework.Script.ScriptManager.GetInstance().LoadCSharpFile(new string[] { "../../../TestApp.Scripts/" });
19 
20             MainManager.GetInstance().Test();
21 
22             Logger.Info("==================End============================");
23             Console.ReadLine();
24         }
25     }
26 }

View Code

我们先品尝运行两遍

美高梅4688.com 8

恐怕上边的打印太乱,我们看看简洁版本的

美高梅4688.com 9

下边我们看样看出来,功效是未曾问题的。

如果你稍微注意了,或者看过我之前的文章的话,会发现我的这个脚本没有实现IBaseScript接口,而只继承了BaseScript抽象类。
因为这样的脚本不需要放到脚本存储器里面,只需要执行init函数,把脚本自身反注册到主程序函数体里面!

当今虽然牵涉更新的工作。

履新有一个题材,当服务一旦部署后需要改进这就是的重复实施加载脚本方法。假设你拔取windows服务运行的,更新势必是一个题材。

这边我只介绍一种形式,http监听情势。

要开启http监听格局,需要一个Net.Sz.Framework.Netty.Http.IHttpHandler的贯彻类

 1 using Net.Sz.Framework.Log;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 
 8 
 9 /**
10  * 
11  * @author 失足程序员
12  * @Blog http://www.cnblogs.com/ty408/
13  * @mail 492794628@qq.com
14  * @phone 13882122019
15  * 
16  */
17 namespace TestApp
18 {
19     /// <summary>
20     /// 
21     /// </summary>
22     public class ReloadScriptHandler : Net.Sz.Framework.Netty.Http.IHttpHandler
23     {
24         public void Action(Net.Sz.Framework.Netty.Http.HttpSession session, string method, string bindpath, Dictionary<string, string> parms)
25         {
26             Logger.Info("收到请求");
27 
28             Net.Sz.Framework.Script.ScriptManager.GetInstance().LoadCSharpFile(new string[] { "../../../TestApp.Scripts/" });
29             MainManager.GetInstance().Test();
30 
31             session.writeSuccess();
32             session.AddBodyLine("OK");
33             session.WriteFlush();
34         }
35     }
36 }

 

接下去我们在主函数插足下面代码

            Dictionary<string, Net.Sz.Framework.Netty.Http.IHttpHandler> handlers = new Dictionary<string, IHttpHandler>();

            handlers.Add("ReloadScript", new ReloadScriptHandler());//开启对http监听,监听模块为  ReloadScript

            Net.Sz.Framework.Netty.NettyPool.GetInstance().AddHttpBind("127.0.0.1", 9527, handlers);

运作起来,看看,

美高梅4688.com 10

可以看出,开启了http监听,reloadscript

然后大家修改一下MainManagerScript文件的Test方法

        public void Test()
        {
            Logger.Info("我是test  修改过的版本");
        }

在浏览器输入:http://127.0.0.1:9527/reloadscript

美高梅4688.com 11

运转时成功的。这样的架构模式,很适合的是娱乐支付,某些功用块很容易出bug,假若用脚本存储器访问相比较耗费性能。

这般反向登记效率块脚本到功用块,既能实现bug的热更新,也不会潜移默化属性消耗。

 

如果有疑问可以留言哦。如果你觉得这纯粹是扯淡,也欢迎留言。

不要问我,逻辑部分都是源码方服务器上安全吗?
难道你打包就安全了?
反编译,脱壳反混淆的工具一大堆。

美高梅4688.com 12

上面是C#本子的,假诺想要源码,

依旧是java源码的,可以留言哦~!

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注