[超简洁]EasyQ框架-应对WEB高并发工作(秒杀、抽奖)等工作

留存瑕疵

除此以外作者要好本人正是个编制程序者所以顺手写在技术博客上,希望谅解。

事先有个秒杀业务要做,用了MVC的异步Action队列处理请求,感觉依旧蛮不错,所以跟此外一人同事共同把那些意义整合进这几个baseContext里面,既未有用第一方的Queue(如
RabbitMQ )也不曾别的开一个宿主进度Exe。

 

唯独总觉得复杂度高,门槛也高,本身学都辛劳,假若协会新人更难接受。所以自从写了最简易的BaseContext类之后非常长壹段时间内都尚未加别的代码。(basecontext只有10行内代码)

 

EasyQ是二个轻量级的专门用来处理高并发HTTP请求的框架。
运用MVC异步Action机制实现了1如既往业务单线程排队处理,未有用别样读写锁。
能够钦命某1种业务创造一条队列,也得以钦定某1种工作+某壹种多少ID作为一条队列。
如秒杀商品业务,能够内定全体秒杀业务都采纳单线程排队处理,制止脏读
脏写。
然则这样做的话,全数秒杀商品都会跻身排队,显明是不得法的。
据此扩大1种艺术是: 秒杀业务+商品ID 作为队列名。
自然不止商品ID,也足以是用户ID,商品分类等任意字符串作为队列名的后缀。
  GITHUB地址:https://github.com/BTteam/EasyQ

故此大家见到娱乐里的“未知”不是恐惧的X掉。而是点开那么些宝箱看看有甚东西,走进那片本白区域照亮前面的路

 

所谓带有创设性的游戏,指的是稍稍游戏恐怕你根据想象力创建游戏成分,玩法等。

public abstract class  QueueBaseContext:BaseContext
    {
       private ILog log = LogManager.GetLogger(typeof(QueueBaseContext));
       private static ConcurrentDictionary<string, ConcurrentQueue<AsyncManager>> killQueues = new ConcurrentDictionary<string, ConcurrentQueue<AsyncManager>>();
        private static ConcurrentDictionary<string, Task> taskDic = new ConcurrentDictionary<string, Task>();
       //场景使用步骤  编写好 1.Interact() 2.Persist() 3.在api调用初始场景后,调用QueueContextAsync()
        private AsyncManager AsyncManager;
        private string quenekey;

       public void SetAsync(AsyncManager _AsyncManager)
       {
           SetAsync(_AsyncManager, "");
       }
       public void SetAsync(AsyncManager _AsyncManager, string _quenekey)
       {
           quenekey = _quenekey;
           this.AsyncManager = _AsyncManager;
       }

       public abstract void InitData();
       public override string Execute()
       {
           if (AsyncManager == null)
           {
               throw new Exception("必须调用SetAsync 设置AsyncManager对象");

           }
         var runtimeType=  this.GetType();
           var qKey = runtimeType.FullName + quenekey;
          // typeof().
           AsyncManager.OutstandingOperations.Increment();
           //开一个队列 判断是否有队列 
           if (killQueues.ContainsKey(qKey) == false)
           {
               killQueues.TryAdd(qKey, new ConcurrentQueue<AsyncManager>(new[] {AsyncManager}));
           }
           else
           {
               killQueues[qKey].Enqueue(AsyncManager);

           }
           Action ac = () =>
           {

               while (killQueues[qKey].IsEmpty == false)
               {
                 //  Thread.Sleep(15000);
                   log.DebugFormat("while 进来了  killQueueitemCount length:{0} ,Q num{1}", killQueues[qKey].Count, killQueues.Count);
                   AsyncManager item;
                   killQueues[qKey].TryDequeue(out item);//取出队列的一个进行处理
                   try
                   {

                       InitData();
                       if (Interact())//对应业务逻辑
                           Persist();

                       AsyncManager.Parameters["response"] = new { Code = this.StatusCode};
                       AsyncManager.OutstandingOperations.Decrement();
                   }
                   catch (Exception e)
                   {
                       log.ErrorFormat("出错,e msg:{0} ,trace:{1}", e.Message, e.StackTrace);
                       AsyncManager.Parameters["response"] = new { Code = ResponseCode.DataError, Description = "服务器错误,请重试" };
                       AsyncManager.OutstandingOperations.Decrement();
                   }
               }
               //remove q
           };
           if (taskDic.ContainsKey(qKey) == false)
           {
               taskDic.TryAdd(qKey, Task.Factory.StartNew(ac));
           }
           if (taskDic[qKey].IsCompleted || taskDic[qKey].IsFaulted)
           {
               taskDic[qKey] = Task.Factory.StartNew(ac);
           }
           return "";
       }


    }

再不下载,安装,玩完,卸载
这几个步骤也挺麻烦。而且开发者们也跟不上玩家的新鲜感降低速度。

一 最近是单点设计,只可以在单机上运营,还在钻探横向扩大。
2 质量还亟需优化
叁 由于使用异步Action 导致每一种Action必须1分为二。

咱俩由此对游乐乐此不彼,是怎么能量驱动着我们?

killQueues :队列名作为KEY 队列实例作为Value
taskDic:队列名作为KEY 队列指定的执行Task作为Value

处理逻辑是创建一个Task 循环队列每次取出一个项,执行业务操作。直到队列为空。
如果在上一个Task运行过程中有新的请求加入,则不需要新建Task,只需要继续加入队列尾部。上一个Task会执行对应的业务操作。
队列中的每一个元素代表一次业务操作,操作完毕之后会调用

AsyncManager.OutstandingOperations.Decrement();
用来返回异步结果给请求线程。这样HTTP请求结果就返回给用户了。不需要等到队列完毕。

qKey可以设置任意字符串,用来细分队列名称。

队列最好用

ConcurrentQueue
因为在入列出列操作时处于多线程共享队列,必须要用线程安全的队列类。

值得一说的是上次自个儿玩3个数值类游戏,一开首只有装备作用,玩到一定水准之后陆续开放“召唤”“秘宝”“商城”“个人属性”“转生”等多样效用。

如能占据您一点光阴,提出1些更上一层楼的意见,不胜多谢!

2,色情暴力

 

  比如CS游戏,在同三个地形图上您玩上百次,每一次从对面跑过来的枪弹大概都是区别品牌的,射在区别的职位,敌人每一次走的取向都比不上。

EasyQ

  沙盒类的玩乐异军突起的天性。比如“笔者的世界”,“饥馑”其实也享有这几个性情。

背景介绍

只因我们由对喜欢的追求,所以我们会追求各类诱惑欢悦的要素。除了追求自身,我们也会创立1些东西来激励欢畅,那正是娱乐。

构建了2个字典 

而是那特个性确实对游戏的可玩性起到关键功能,不说尤其。

主干解析

就比如打BOSS,进度中大家恐怕死了N次,分裂角度的花式死法之后突然1个暴击,BOSS芥兰了。装备爆出来,绿的橙的紫的。

调用是U奥迪Q伍L为:{host}/home/text 注意Async后缀在路由时会被去掉。
SetAsync方法必须传入AsyncManager对象,key是可选参数,如上所述是用来细分队列的。
借使想根据商品ID生成队列,差别商品的秒杀行为在不相同的系列中排队,就在那边用SetAsync传入key是货物ID

 

 全数Context执行后的结果以Parameters[“response”]返回

  突然画风突变讲
喜悦与难熬。是想说热情洋溢本人只是三个绝对量,并非相对量。既然是四个相持的词,那么在戏耍里设置某些有难度的关卡之后再来点正向反馈。唯有那样配对出现才能更加好的鼓舞兴奋属性。那就是性子索求的头等大事。

QueueBaseContext类

玩法的多种化,满意了人的好奇心,探索欲望,创设玩法的进度中也迟早程度的满意了自作者达成。有些尤其的游戏设置还会满意人的真情实意须求,比如“仙剑”种类的好玩的事剧情形式

public void TestAsync(string key)
{
//GET DATA
TestContext context = new TestContext(1);
context.SetAsync(AsyncManager, key);//参数为产品队列标识
context.Execute();
}

(突然觉得那种艺术尤其像是“打狗一顿再给壹根骨头”,要不要换个名字叫“打狗给骨头”呢?)

总之“simple is good!”

为此会写那个,是前边偶然看到任天堂的某些dalao
提到“游戏性”那件事,觉得有趣,加上作者也是2个老牌玩家,各类游戏都装有涉猎。

    这几年一直在物色壹种框架,丰富不难,又能应付很多高并发高品质的供给。研讨过部分框架思想如DDD
DCI,也推行过CQ牧马人S框架。

  后面说了三种最核心的供给,但是有时太过主导的事物,实际上是短缺可实践性,所以那边大家铺开来讲由那3种要求演变后并整治而来的游乐属性

public ActionResult TestCompleted()
{
var result = AsyncManager.Parameters["response"];

return Content(JsonConvert.SerializeObject( result));
}

例如部分创立性的嬉戏,能够十分大程度的抒发人的想象力,并且在游玩中贯彻。

选取表达

那种游戏从出生就自行设计好的玩法,在量级上自然不能比拟后期玩家自身打通出来的玩法多。但是在此处大家也能够分类到“玩法多种”上。

HomeController
是进口页面,须求一而再AsyncController,使用MVC的异步Action
BT.Contexts项目放置业务代码,全部Context需求继续抽象类QueueBaseContext,并且实现三个章程
1,InitData 早先化数据,数据库获取数据的措施应该写在那里
二,Interact 交互操作,数据模型之间的互相,业务代码的各类总计、判断等
三,Persist 持久化操作,数据保存到数据库的操作应当写在此间。
那个方法的私下认可执行步骤非凡简单 一=》2=》3
  那个类是包装了队列、线程的操作,是EasyQ的中坚类。
在HomeController使用Context时,首先应当分别三个Action 如 TestAsync
TestCompleted。这是MVC异步Action的编写制定控制
TestAsync用来运维异步,TestCompleted是异步完结后的回调操作。那3个主意必须成对出现。具体原理请参见MSDN

  其实那性情情作者犹豫了很久要不要加盟,不过多年的游玩经验让自己理解1件事,可以与伙伴们共同玩的游乐就很好玩了,无关台式机人好不佳玩。

澳门美高梅手机网站,再看回调方法

世家一定听过一句话“与人斗,其乐无穷”。

5 创造性

反过来说,如若只懂欢悦,感受不到痛心,那么迟早死于危险。难过也是1种警示,警告你远离危险,警告你转移自个儿,改变环境。

3,攀比属性

那正是玩法八种的显示。

  什么是游戏可玩性?一句话总结介绍,就是“使得游戏好玩的特点”。

对爱的须求,各个的真情实意宣泄,忧伤,生气,搞笑,惊奇,恐惧。这都以130日游拥有可玩性的性状。

  可是必须怀有一定的难度,不能够把玩家带入“恐慌区”。不过事实上也能够万分难,那么对少部分有名玩家来说是幽默的游玩,可是超越四分之三个人会吐槽“垃圾游戏”就是。

 

3 对自我达成的要求

镜头好坏,跟1个游戏的可玩性并未太大的关系,画面不好如“笔者的世界”那种像素格游戏照样有恢宏玩家。画面美观当然会激发壹些玩家,不过其实是从审美的角度出发,并非从娱乐角度出发,美观固然好,然则玩法是其余3个维度。

  肯定读到那篇随笔的时候大家会问这一个题材

  也许有人要问?WHAT?
对抗类哪儿丰裕玩法了?不就是你打本人,笔者打你嘛。

  那种刺激能够是其余格局的,可以是毫无意义的,比如俄罗丝方块过关之后的分数,又不可能吃。

  对抗类面对的是其余2个玩家,那么不论游戏自身设定的多多简单,玩法总会一视同仁。


缘何写游戏可玩性?

一,画面漂亮

论游戏的可玩性

1 对欢畅的求偶

  自然老母给予大家最佳的礼物正是让大家“追求喜悦,远离悲伤”。

本来就游戏本身而言,它是不富有的。可是我们切磋的是可玩性,并非学究一样要这么严酷。

其实各类人对游乐的喜好都不及,有的人爱不释手RAV肆PG,有的人爱不释手守塔,萝卜包心白菜各有所爱。

  可是那里有个度,你不能设计3个无比复杂的玩耍,让玩家一下去接受它。这就一定于把人从“舒适区”赶过“探索区”直接来到“恐慌区”

例如围棋,规则不难(敌方棋的五个出口堵住能够消灭之),可是战局丰硕,八个棋子落下有360种也许,那么总的围棋走法有微微种?10的767次方,比全宇宙有着粒子数(10的七十六次方)加起来还多。玩那游戏真的能够玩到天荒地老。而且随时都或者有新的走法被发明出来。

又比如对抗类游戏,比赛类游戏。

为什么会说“身在福中不知福”。比如说自由,当今社会,自由度其实对种种人的话都很高。不过在十0年前,近期的自由度对当时的人们而言是多么的幸福。可是前几天又有稍许人以为那份自由可贵?他们或者还在呼喊着要更加多的任性。

 

  本次讲的话题是玩玩可玩性,可能叫“游戏性”也得以,那是专用术语,大家可以找寻一下素材与自个儿这篇对照比较。

因为大家都可以研究有所游戏啊,全体游戏都有攻略啊。

刺激了好奇心并且完全的知足了它,那正是玩玩的可玩性。

随正是有时候是刷新新鲜感最棒的格局,真正的任意,是人力不足预测,永远充满未知,下一刻,大概是万丈深渊,也说不定是极乐天堂。

下一场当然很多少人乘机奖励而去,可是由于官方要控制奖励人数,所以在举不胜举地点设置了无数升任障碍,比如BOSS很难打,升级经验很少,义务难度进步,装备质量下跌等等。

怎么在技能博客写关于游戏的?

  人类生而对那个世界充满好奇心,好奇心是精通生物的附属。

 

 

  这么些词笔者合计很久了,感觉应该最切贴的布道。指的是在玩某游戏的经过中,总是有壹对刺激反馈给玩家。而且取得激励的长河或许是某个难熬的,困难的。

只有满足了其他四项,这几个供给才会被提上日程。

自个儿得以交给一套强弱的单位参照,然而本身却不能够把具备的张罗事项都列出来区分高下。

  那天本性大概有点跟“玩法多种”有稍许的重叠。因为一些玩法多种的游玩同时其实也是出于随机性才造成玩法丰裕的。

 

从性子角度来想想

现实的例证可能是“火炬之光”,单机ENCOREPG游戏,跟“银灰破坏神”类似。个中有2个编写制定是,每一次变更副本地图时都以随机生成的。地宫里全部的成分都以随便的,路线,地面材质,附属物,怪物地方,怪物体系,宝箱地方,BOSS属性等。

那游戏是单机的,正是说整个经过中未有别的海腴与。可是其实它也有所一点社交属性,因为总有一对网址会提供论坛,大家探究一下生存方式,如何才能干掉某些BOSS之类,其实那样大家也能称之为“社交”属性。

  那种正向反馈的体制也务必是连绵不断不断的,不然获得奖励之后玩家就拜拜了。
拜拜就拜拜,其实也不失为三个“只可以玩会儿的好游戏”。然则当然大家是梦想能长久一点。

  笔者原本管那种艺术叫“激励属性”。

其1世界并无神,造物者就是我们温馨,连神那么些概念都以全人类本人造的。

1,玩法各种

  言归正传,可玩性究竟是哪些吗?它的本质是什么样?

本着人性弱点而开发的游乐其实也具备一定可玩性,但是那类刺激人性弱点的娱乐在满足那一个弱点的同时也是推广这一个老毛病。

就如小时候在海滩玩沙雕,玩积木,搭建各类种种小玩意儿。

可玩性的心思来源能够分成以下项目:

收十具备可玩性的玩耍属性

游戏可玩性定义


比如说作者玩单机游戏“饔飧不给”
单机版,(近年来TGP出了“饥馑联机版”以此区分)。那游戏是个生存类,游戏规则是游戏人物被丢到孤岛上生活。只要你接纳各样财富建造,应对怪物,饥饿,恐惧等好好活下去,活到地老天荒就能够了。

娱乐那种事情会有那多少人觉着“玩物丧志”,不过不可不可以认的是从有人类来说,人那种生物,或许全体生物界也在自行的成立着游戏来取悦自身,取悦外人。

就此会列出来一些,并且附上缘由。供大家参考,欢迎来驳。

本人以为有些越发特殊的娱乐中具有了令人“自笔者实现”的特质,所以显得好玩。

打闹需求必然已经种在我们基因中了。从这些角度而言所谓“玩物丧志”大概才是邪说了。玩笑一下哈。

 

 

也得以这么说!(妖~别丢砖头)

  1个通关的游玩一定是拥有各个各个的玩法,它的条条框框能够简不难单,不过变化三种,唯有玩法的种种化才能刷新新鲜感,否则“枯燥”一词就足以给那几个游乐定死刑了。

因而想整理一下祥和对娱乐可玩性的壹些思想。

但在伍光10色的游艺之中,我们还能够发现里底部分相似性情,从而整理出来,为创制下二个更幽默的玩耍做1些踏脚石的意义。

造物,这正是自作者实现。

  各种人一定也有1对自认为是可玩性但不在作者上述范围内的品质,恐怕里面有1些并不是本身平昔不认识到它,而是本人觉着它并非衡量二个嬉戏好不佳玩的正儿捌经。

2 正向反馈

可玩性背后的本性解析

  所以大家看看尽管是有着了“玩法多种”的嬉戏,它也首先是“不难接受”的。
单机瑞虎PG游戏也不是一早先就给您解放全技能。设计好的玩法必须是稳中求进的。

  马斯洛认为,人类有伍种基本需求,在那之中最高的一种名字为“自作者实现的急需”

  说三个特地例子,从前玩过“龙腾世界”CR-VPG网络游戏,开服之后官方设置了贰个职务,只要在1个月之内玩家达到40级,就能博取现金多少多少的。

  也能够是自洽的款式,比如打完BOSS送积分,积分换更加好的配备,继续打BOSS,继续送积分。

那么是否说其实具备游戏都怀有“社交”呢?

不过自个儿当时以为尤其好玩。后来3个月到期了。40级的嘉奖未有了。游戏可能一样游戏,玩法照旧壹样的玩,BOSS简单打了,升级不难,各个不难。不过就没了兴致了,因为难度降低,正向反馈撤废。这就是自家的敞亮。

您在嬉戏里鼓励大家攀比,即便带来了壹部分可有可无的野趣,但是也拉长了攀比心思。对人心智的老到发展是重伤的。不提倡。

重在是勉强觉得IT人对游戏的敞亮会进一步深切,玩的也多,认识的多多IT朋友玩游戏也会比较深,所以发在那边或许能侥幸获得一些指正。

要么部分规划丰盛的玩法,比如LX570PG单机游,多量的天职,技能树,各个关卡,BOSS
怪物。整1个游戏线下来,包括创设者设计的有余玩法。

  计算一下,玩游戏总归须要有个度,时间要合理布署,若是整天沉迷在游戏中,不干预现实世界怎么着,其实是越发影响生活难点的。生存难题得不到解决谈自作者达成,谈欢快是不得法的。此外游戏世界与现实世界实质上并无太大差异,也同等能提供所需的成套需要。难度越来越高,唯有一条命,请我们认真攻略。

大家会自然的走出洞穴看望外面,看到深林业余大学学火过后的熟食,好奇的拿起来品尝,“bong!”
“yami!”

然而大家必将要说强弱度。比如“笔者跟生死多年的小伙伴壹起玩LOL”跟“作者跟路人甲商量俄罗丝方块的摆法”来相比较社交度的强弱。

3,张罗属性

  其实欢愉有时候是索要相比较的,只有跟痛楚相比较。欢跃才会设有。

而是随机性跟玩法七种依然有过多差别的。

2 对世界的好奇

不认可作为可玩性的质量及原因

 

那么恐慌区的人自然便是“卸载”。

4 随机性

假定1位只可以感觉优伤,未有欢快。那么迟早会死于忧郁。

交际属性能够领悟为在娱乐的进度中与别人形成彼此,并不一定要设置诸如“聊天”“好友”“排名榜”“组成代表队”“交易”等成效才能称为“社交”,当然有这几个成效也是了。可是自个儿在那里要提1些尤其景况,以便咱们精通那些概念实际上更广阔1些。

实际上都休想解释的,政治正确的。可是那类游戏其实对我们是有重伤的,具破坏性的,不提倡。

发表评论

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