2021-06-04

第9课 消息队列 SenparcMessageQueue

使用消息队列,执行有顺序的异步操作

文章说明:

  本文是基于盛派网络苏震巍老师的《微信公众号+小程序快速开发》课程笔记。

课程地址:

  https://study.163.com/course/courseMain.htm?courseId=1004873017

本课项目地址:

  https://github.com/wechatdeveloper/WechatVideoCourse

课程目标

  使用消息队列,执行有顺序的异步操作。也就是把蜂拥而至的请求,进行排队后,按照先进先执行的规则有顺序的执行。

 

队列图示:

 

微信中使用场景 :

大量用户向公众号发起消息请求,而微信的规则是需要在5S内响应返回给用户;

如果大量的并发请求出现,应用服务器可能产生堵塞,无法及时响应用户;

可变通的方法是:把所有的请求加入队列中,在队列中以客人消息的方式返回给用户,从而保证用户有良好的体验。

 

SDK SenparcMessageQueue 源码解读:

源码位置:https://github.com/Senparc/Senparc.CO2NET

把1个个的对象【SenparcMessageQueueItem】(Key标识唯一性),放到队列【MessageQueueDictionary】中, 然后逐个执行【OperateQueue】

 

【SenparcMessageQueueItem】:

 1   /// <summary> 2   /// 队列项唯一标识 3   /// </summary> 4   public string Key { get; set; } 5   /// <summary> 6   /// 队列项目命中触发时执行的委托 7   /// </summary> 8   public Action Action { get; set; } 9   /// <summary>10   /// 此实例对象的创建时间11   /// </summary>12   public DateTimeOffset AddTime { get; set; }13   /// <summary>14   /// 项目说明(主要用于调试)15   /// </summary>16   public string Description { get; set; }17 18   /// <summary>19   /// 初始化SenparcMessageQueue消息队列项20   /// </summary>21   /// <param name="key"></param>22   /// <param name="action"></param>23   /// <param name="description"></param>24   public SenparcMessageQueueItem(string key, Action action, string description = null)25   {26    Key = key;27    Action = action;28    Description = description;29    AddTime = SystemTime.Now;30   }

 

【OperateQueue】获取对象 => 逐个执行 => 清除已执行的对象 => 获取下一个对象

 1      /// <summary> 2   /// 操作队列 3   /// </summary> 4   public static void OperateQueue() 5   { 6    lock (FlushCacheLock) 7    { 8     var mq = new SenparcMessageQueue(); 9     var key = mq.GetCurrentKey(); //获取最新的Key10     while (!string.IsNullOrEmpty(key))11     {12      var mqItem = mq.GetItem(key); //获取任务项13      mqItem.Action(); //执行14      mq.Remove(key, out SenparcMessageQueueItem value); //清除15      key = mq.GetCurrentKey(); //获取最新的Key16     }17    }18   }

 

获取对象,是根据先进先出的原则:

 1   /// <summary> 2   /// 获取当前等待执行的Key 3   /// </summary> 4   /// <returns></returns> 5   public string GetCurrentKey() 6   { 7    lock (MessageQueueSyncLock) 8    { 9     //不直接使用 Key 是因为 Key 的顺序是不确定的10     var value = MessageQueueDictionary.Values.OrderBy(z=>z.AddTime).FirstOrDefault();11     if (value==null)12     {13      return null;14     }15     return value.Key;16    }17   }

 

队列执行效果:

 

 

 

 

 

 


 









原文转载:http://www.shaoqun.com/a/784149.html

跨境电商:https://www.ikjzd.com/

欧舒丹:https://www.ikjzd.com/w/1756

淘粉吧官网:https://www.ikjzd.com/w/1725.html

tineye:https://www.ikjzd.com/w/448

自贸区跨境通网站:https://www.ikjzd.com/w/1329


使用消息队列,执行有顺序的异步操作文章说明:  本文是基于盛派网络苏震巍老师的《微信公众号+小程序快速开发》课程笔记。课程地址:  https://study.163.com/course/courseMain.htm?courseId=1004873017本课项目地址:  https://github.com/wechatdeveloper/WechatVideoCourse课程目标:  使用消
55海淘网:https://www.ikjzd.com/w/1723
ideal:https://www.ikjzd.com/w/2286
香港会计师事务所:https://www.ikjzd.com/w/2434
囧!我嫁给一个爱哭的老公:http://lady.shaoqun.com/m/a/273351.html
老公说离婚分财产只能给我条内裤:http://lady.shaoqun.com/m/a/271522.html
口述最舒服的一次恋爱经历 被人追求的感觉真好:http://lady.shaoqun.com/m/a/269866.html
亚马逊企业卖家可创建自动定价规则:https://www.ikjzd.com/articles/145356
Lazada如何打造高质量的Listing?:https://www.ikjzd.com/articles/145355
深圳盐田港的拥堵状况正在恶化、全球集装箱运价创历史最高:https://www.ikjzd.com/articles/145353

No comments:

Post a Comment