• 第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(); //获取最新的Key
    10                 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(); //获取最新的Key
    16                 }
    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         }

    队列执行效果:

     客服消息使用规则: 

    在用户点击自定义菜单、关注公众号、扫描二维码等三个场景中,开发者在收到事件通知后1分钟内可调用客服消息接口向用户下发3条客服消息;在用户发送消息和支付成功场景中规则不变。

    参考:https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&announce_id=11618397077rzy6X


  • 相关阅读:
    与DSP通信时,RD&WR信号
    4.2.1 Vector bit-select and part-select addressing
    数据校验
    数据结构 (树,图)
    ASOP编译说明
    os
    20180203-增与查
    yum安装MariaDB
    20180202之engine,URL,base,session
    列表
  • 原文地址:https://www.cnblogs.com/WechatDeveloper/p/SenparcWeixinSDK-Course-9.html
Copyright © 2020-2023  润新知