成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用緩存防擊穿,解決微信”被動回復(fù)用戶消息”重試回復(fù)問題

存儲 數(shù)據(jù)管理
使用緩存機(jī)制,把第一次的結(jié)果保存下來,對方重試的時候,直接返回上次的結(jié)果。使用lock ,保證并發(fā)的時候,若同時有多個 thread要求相同資料,只會(到數(shù)據(jù)庫)查第一次,剩下的從 cache讀取。

背景

 做微信公眾號開發(fā)的時候,其中有個接收普通消息、接收事件推送 API。

有這么條規(guī)則,  ”微信服務(wù)器在五秒內(nèi)收不到響應(yīng)會斷掉連接,并且重新發(fā)起請求,總共重試三次。假如服務(wù)器無法保證在五秒內(nèi)處理并回復(fù),可以直接回復(fù)空串,微信服務(wù)器不會對此作任何處理,并且不會發(fā)起重試。詳情請見“發(fā)送消息-被動回復(fù)消息””。

概括起來就2點(diǎn)

1、就是說5s沒響應(yīng),這個請求就會被放棄;

2、會重新發(fā)起請求,具有冪等性;

問題

這樣就會產(chǎn)生2個問題。

1、假設(shè)我的方法就正好需要6s,那么即使返回結(jié)果也是沒用的,因?yàn)檎埱蟊环艞壛恕?/p>

2、我需要返回給用戶正確的回信,假設(shè)第一次超時沒法及時回信,比如綁定操作,第一次沒回信,第二次再來總不能回復(fù)綁定過了,這樣顯然不合理。

圖片圖片

或者直接回復(fù) success ,這樣顯然沒法正常的進(jìn)行消息提醒。

那么怎么做到既執(zhí)行了操作(第一次超時了),(第二次微信重試)又及時回復(fù)正確的回信呢 。

圖片圖片

代碼實(shí)現(xiàn)

1、定義緩存的key,就是消息MsgId。

string cacheKey = model.MsgId.ToString();


2、使用緩存機(jī)制,把結(jié)果緩存起來,下次進(jìn)來,直接回復(fù)上次執(zhí)行的結(jié)果。

TimeSpan expired = new TimeSpan(0, 0, 20);
                    string cacheKey = model.MsgId.ToString();
                    return _cacheLayer.Get(cacheKey, () =>
                    {
                        MsgReply param = new MsgReply() { ToUserName = model.FromUserName, FromUserName = model.ToUserName };
                        string Jsonstr = WeiXinHelper.ReadAccess(HttpRuntime.AppDomainAppPath.ToString() + "/App_Data/WeChat/KeyWordReplay.json");
                        var r = JsonConvert.DeserializeObject<AutoReplay>(Jsonstr);
                        param.Content = r.content;
                        if (String.Equals(model.MsgType, "text", StringComparison.CurrentCultureIgnoreCase))
                        {
                            var item = r.keywordcontent.FirstOrDefault(o => o.keyword.Contains(model.Content));
                            if (item != null)
                            {
                                param.Content = item.content;
                            }
                        }


                        string response = _weChatAlertsService.SubscribeReply(param);
                        AddReceiveLog(model, xml, response);
                        return response;
                    }, expired);

3、這樣既解決冪等問題,也返回了正確的結(jié)果。

4、這里需要注意,緩存取得每個 Key專有的 lock object;若同時有多個 thread要求相同資料,只會(到數(shù)據(jù)庫)查第一次,剩下的從 cache讀取。

public T Get<T>(string key, Func<T> getDataWork, TimeSpan absoluteExpireTime, bool forceRefresh = false, bool returnCopy = true) where T : class
        {
            try
            {
                lock (GetMemoryCacheLockObject(key))
                {
private static object GetMemoryCacheLockObject(string key)
        {
            string cacheLockKey = string.Format(MemoryCacheLockObjectFormat, key);
            lock (CacheObject)
            {
                var lockObject = CacheObject[cacheLockKey];
                if (lockObject == null)
                {
                    // 取得每個 Key專屬的 lock object;若同時有多個 thread要求相同資料,只會(到資料庫)查第一次,剩下的從 cache讀取
                    lockObject = new object();
                    CacheObject.Set(
                        cacheLockKey,
                        lockObject,
                        new System.Runtime.Caching.CacheItemPolicy()
                        {
                            AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(10)
                        }
                    );
                }


                return lockObject;
            }
        }

總結(jié)

1、使用緩存機(jī)制,把第一次的結(jié)果保存下來,對方重試的時候,直接返回上次的結(jié)果。

2、使用lock ,保證并發(fā)的時候,若同時有多個 thread要求相同資料,只會(到數(shù)據(jù)庫)查第一次,剩下的從 cache讀取。


責(zé)任編輯:武曉燕 來源: 程序員編程日記
相關(guān)推薦

2021-02-02 05:42:43

緩存微信重試

2024-10-22 08:30:21

lockthread數(shù)據(jù)庫

2013-04-10 18:48:56

微信公眾平臺技巧

2013-04-09 18:13:44

微信公眾平臺關(guān)鍵詞

2020-07-02 13:10:49

PyWeChatSpy拍一拍Python

2018-06-29 09:53:07

Python微信自動回復(fù)

2013-04-10 16:04:12

微信微信機(jī)器人技巧

2023-01-31 08:37:11

緩存穿透擊穿

2017-03-17 15:10:52

微信消息撤回功能

2021-01-14 10:58:03

Python表情包微信

2022-03-08 00:07:51

緩存雪崩數(shù)據(jù)庫

2023-11-10 14:58:03

2024-07-12 08:48:50

2021-01-31 10:51:37

緩存lock數(shù)據(jù)

2021-04-18 10:24:35

WhatsAppAndroid惡意軟件

2021-07-19 22:31:39

微信微信客服移動應(yīng)用

2018-11-12 11:12:46

2013-01-10 16:32:39

Google開發(fā)者Google Play

2013-05-24 09:35:46

Java實(shí)現(xiàn)

2013-05-14 10:07:13

谷歌
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品视频一 | 妞干网av| 青青草原精品99久久精品66 | 国产高清精品一区二区三区 | 欧美精品在线播放 | 日韩在线一区视频 | 国产高清在线 | 亚洲欧美视频 | 亚洲婷婷一区 | 欧美综合在线视频 | 国产精品久久久久久久7电影 | 成人一区二区视频 | 懂色中文一区二区三区在线视频 | 国产片侵犯亲女视频播放 | 免费午夜视频在线观看 | 欧美群妇大交群中文字幕 | 91av视频 | 久久久久国产精品一区二区 | 国产一区二区日韩 | 久热9| 欧美激情啪啪 | 国产免费一级片 | 国产一区二区精品在线观看 | 成人a视频片观看免费 | 久久久精品影院 | 欧美黄色片在线观看 | 日韩在线视频观看 | 午夜合集 | 国产成人99av超碰超爽 | 欧美精品网站 | 国产精品久久久久久一区二区三区 | 一级在线 | 色又黄又爽网站www久久 | 亚洲午夜电影 | 亚洲综合色视频在线观看 | 欧美一级黄色片在线观看 | 全部免费毛片在线播放网站 | 五月激情婷婷六月 | 欧美一区二区视频 | 伊人超碰 | 久久免费精品视频 |