背景
做微信公众号开发的时候,其中有个接收普通消息、接收事件推送 API。
有这么条规则, ”微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息””。
概括起来就2点
1、就是说5s没响应,这个请求就会被放弃;
2、会重新发起请求,具有幂等性;
问题
这样就会产生2个问题。
1、假设我的方法就正好需要6s,那么即使返回结果也是没用的,因为请求被放弃了。
2、我需要返回给用户正确的回信,假设第一次超时没法及时回信,比如绑定操作,第一次没回信,第二次再来总不能回复绑定过了,这样显然不合理。
图片
或者直接回复 success ,这样显然没法正常的进行消息提醒。
那么怎么做到既执行了操作(第一次超时了),(第二次微信重试)又及时回复正确的回信呢 。
图片
代码实现
1、定义缓存的key,就是消息MsgId。
2、使用缓存机制,把结果缓存起来,下次进来,直接回复上次执行的结果。
3、这样既解决幂等问题,也返回了正确的结果。
4、这里需要注意,缓存取得每个 Key专有的 lock object;若同时有多个 thread要求相同资料,只会(到数据库)查第一次,剩下的从 cache读取。
总结
1、使用缓存机制,把第一次的结果保存下来,对方重试的时候,直接返回上次的结果。
2、使用lock ,保证并发的时候,若同时有多个 thread要求相同资料,只会(到数据库)查第一次,剩下的从 cache读取。