使用缓存防击穿,解决微信”被动回复用户消息”重试回复问题

背景

 做微信公众号开发的时候,其中有个接收普通消息、接收事件推送 API。

有这么条规则,  ”微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息””。

概括起来就2点

1、就是说5s没响应,这个请求就会被放弃;

2、会重新发起请求,具有幂等性;

问题

这样就会产生2个问题。

1、假设我的方法就正好需要6s,那么即使返回结果也是没用的,因为请求被放弃了。

2、我需要返回给用户正确的回信,假设第一次超时没法及时回信,比如绑定操作,第一次没回信,第二次再来总不能回复绑定过了,这样显然不合理。

或者直接回复 success ,这样显然没法正常的进行消息提醒。

那么怎么做到既执行了操作(第一次超时了),(第二次微信重试)又及时回复正确的回信呢 。

代码实现

1、定义缓存的key,就是消息MsgId。

  string cacheKey = model.MsgId.ToString();

2、使用缓存机制,把结果缓存起来,下次进来,直接回复上次执行的结果。

  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、这样既解决幂等问题,也返回了正确的结果。

4、这里需要注意,缓存取得每个 Key专有的 lock object;若同时有多个 thread要求相同资料,只会(到数据库)查第一次,剩下的从 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;}}

总结

1、使用缓存机制,把第一次的结果保存下来,对方重试的时候,直接返回上次的结果。

2、使用lock ,保证并发的时候,若同时有多个 thread要求相同资料,只会(到数据库)查第一次,剩下的从 cache读取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美国硅谷预测10年后的世界,再不懂你就落伍了

预测毕竟是预测&#xff0c;不一定会全部都会实现&#xff0c;但其中相当多的一部分将会成为我们生活中的现实。生活在信息社会的每一个人&#xff0c;都应该对这些发展趋势有所了解&#xff0c;特此推荐给我们的读者朋友。现在因为人工智能(AI)的发展&#xff0c;配合更高速度…

谷歌浏览器安卓_安卓免费时代结束,国产手机或将集体涨价?

天下没有免费的午餐&#xff0c;免费多年的谷歌安卓系统或许即将成为历史。昨天上午&#xff0c;有网友发现&#xff0c;安卓官方推特账号发布推文&#xff0c;宣称公司计划在今年第三季度向中国手机厂商收取费用&#xff0c;包括华为、中兴、小米等。尽管这条消息又被秒删&…

参赛方案-主机托管、中小企业虚拟化应用

方案1&#xff1a;单服务器主机托管解决方案<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1.1 用户需求 在Internet普及的今天&#xff0c;每个单位都加大了在信息化方面前进的步伐&#xff0c;其中一个最基本的表现就是在电信…

腾讯急招.NET,但你准备好了吗?

新年至&#xff0c;腾讯开招.NET&#xff01;你准备好了吗&#xff1f;展望2021&#xff0c;可以预见.NET5、微服务、云原生将是大热话题&#xff0c;高并发必备的Redis、MongoDB、ElasticSearch依旧热门。新的一年&#xff0c;大厂对.NETer需求越来越大&#xff0c;大家要如何…

国庆中秋活动——让孩子亲近数学并爱上数学:《数学小侦探》来袭(来自科大出版社的福利)

通知&#xff01;通知&#xff01;通知&#xff01;&#xff01;&#xff01;玩酷屋十一黄金优惠限时限量秒杀活动&#xff0c;能抢到算你厉害&#xff1a;1、活动期间 2017/09/30 22:30 ——2017/10/03 22:302、【数学小侦探】原价 82元&#xff0c;秒杀活动价 76元3、节假日…

hadoop可以解决什么问题_聊一聊,临时工外包可以为企业解决什么问题

企业存在用人难的问题已经不是一天两天了&#xff0c;有些企业为了解决用人难的问题会选择临时工外包服务&#xff0c;相信大家都是知道这样的方式&#xff0c;可以有效的节省企业的人力物力&#xff0c;但大家都比较关心的是临时工外包可以为企业解决什么问题&#xff1f;现在…

图文并茂——使用xfire编写webservice,并通过C#调用

.首先建立一个web service工程&#xff1a;点击finish之后&#xff0c;myeclipse自动帮你生成services.xml以及web应用目录结构&#xff0c;其中的services.xml是你导出服务的配置文件&#xff0c;注意在WEB-INF/web.xml文件中配置了xfire自己的servlet. <servlet><se…

如何在 ASP.Net Core 中使用 Serilog

记录日志的一个作用就是方便对应用程序进行跟踪和排错调查&#xff0c;在实际应用上都是引入 日志框架&#xff0c;但如果你的 日志文件 包含非结构化的数据&#xff0c;那么查询起来将是一个噩梦&#xff0c;所以需要在记录日志的时候采用结构化方式。将日志结构化可以更容易的…

看国外女神级程序员,直播写代码一年的感悟

我第一次直播写代码是在去年七月份。我想要直播一下我在业余时间内为开源项目领域所做的工作&#xff0c;尽管在youtube上的大部分直播都是关于游戏的。我比较擅长于NodeJS的硬件库方面的工作&#xff08;尽管大部分项目都是自己的&#xff09;。并且我在youtube上曾经开启过一…

windows制作定时关机脚本_自动关机、自动打开程序… 让Windows自动执行任何操作...

文章转载于网络&#xff0c;侵删Windows 中有一个非常棒的功能&#xff0c;叫做“任务计划程序”&#xff0c;但是因为它的界面看起来有点复杂&#xff0c;导致很少有人使用它。其实对于任何人而言&#xff0c;“任务计划程序”都是非常棒的工具&#xff0c;它可以让 Windows 在…

techempower拿分系列之aspcore分析

techempower是一个Web Framework Benchmarks测试平台&#xff0c;世界上各大Web框架都参与其中&#xff0c;当然BeetleX也不例外。接下来的几篇文章中讲述aspcore使用怎样的方式在这评测中获取相对比较高的分数&#xff1b;而BeetleX使用了这些技巧之后也在是近测中获取的前10&…

mysqlbinlog工具_mysqlbinlog命令详解 Part 1-实验环境准备

前面的一些章节我们对mysqldump常用命令进行了讲解这个专题的内容为mysqlbinlog命令的详解mysqlbinlog是mySQL中用来处理binlog的工具1. MySQL二进制日志介绍服务器的binlog包含一些event这些event描述了数据库内容的状态&#xff0c;包含了数据修改&#xff0c;服务器重启等&a…

是学习Java还是Python?一张图告诉你!

Java 和 Python 一直都是两种很火很强大的编程语言&#xff0c;对于刚开始起步学习编程的同学来说&#xff0c;会迷惑且最经常问的问题是&#xff0c;我该学 Java 还是 Python&#xff0c;是不是 Python 容易学&#xff0c;或是应该先学什么编程语言等等这样的问题。作为一名 J…

Java游戏吉他英雄_《吉他英雄:现场》《摇滚乐队4》横向对比:各有所长!

《吉他英雄&#xff1a;现场》《摇滚乐队4》横向对比&#xff1a;各有所长&#xff01;2015-11-29 10:29:07来源&#xff1a;界面编辑&#xff1a;评论(0)作为摇滚游戏界两大支柱&#xff0c;最近回归的《吉他英雄&#xff1a;现场(Guitar Hero Live)》(以下简称GHL)和《摇滚乐…

_云计算学习路线图素材课件,Linux中软件安装的方式

很多初学者感觉云计算就是一个听起来比较高大上的名词&#xff0c;每次想要了解它的时候都像是雾里看花&#xff0c;迷迷糊糊看不真切&#xff0c;至于它是干什么的就更不了解了&#xff0c;其实云计算学起来在IT行业中还是比较容易上手的&#xff0c;接下来我给大家分享Linux中…

Redis集群搭建很easy

前言 哨兵模式虽然让读写分离更加高可用&#xff0c;但单台服务器由于本身的内存和CPU瓶颈&#xff0c;对于高并发和大数据业务的应用场景还是远远不能满足&#xff1b;对于这种情况&#xff0c;有点经验的小伙伴会毫不犹豫的想到集群&#xff0c;搞他好几个节点&#xff0c;负…

国庆中秋活动——读完这两套书,宝宝就变小小物理学家了!

通知&#xff01;通知&#xff01;通知&#xff01;&#xff01;&#xff01;玩酷屋十一黄金优惠限时限量秒杀活动&#xff0c;能抢到算你厉害&#xff1a;1、活动期间 2017/10/02 22:30 ——2017/10/05 22:302、【宝宝的物理学】第一辑 原价&#xff1a;189元&#xff0c;秒…

java的正则表达式 CPU_小心踩雷!一个小小的正则表达式竟把CPU拖垮......

原标题&#xff1a;小心踩雷&#xff01;一个小小的正则表达式竟把CPU拖垮......“前几天线上一个项目监控信息突然报告异常&#xff0c;上到机器上后查看相关资源的使用情况&#xff0c;发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具&#xff0c;我们导出了出问题…

欲善其事,先利其器 | IDCF第6期DevOps案例研究回顾(附视频)

2021年&#xff0c;会有哪些“意想不到”在等待我们&#xff1f;2021年&#xff0c;会有哪些“变与不变”在等待我们&#xff1f;这些&#xff0c;都未可知。借假修真&#xff0c;唯一可知的是过去有哪些值得我们借鉴与学习&#xff0c;并帮助我们更好前进的经验。2021年开端&a…

电脑任务管理器快捷键_电脑知识小常识

0、计算机专业的学生的电脑常识未必有你多&#xff0c;电脑坏了找他们没用。1、重启。不管啥问题&#xff0c;上来就是重启。2、找一个学过计算机的来重启。3、还不行就让那个学过计算机的给你重装个系统。4、再不行就换个电脑吧。5、妹子可以忽视以上规则&#xff0c;直接找计…