文章說明:
本文是基于盛派網路蘇震巍老師的《微信公眾號+小程式快速開發》課程筆記,
課程地址:
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 = https://www.cnblogs.com/WechatDeveloper/p/MessageQueueDictionary.Values.OrderBy(z=>z.AddTime).FirstOrDefault(); 11 if (value=https://www.cnblogs.com/WechatDeveloper/p/=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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/285347.html
標籤:C#
