高并发使用wechatpy,微信component_access_token超过使用问题

时间:2021-09-10
本文章向大家介绍高并发使用wechatpy,微信component_access_token超过使用问题,主要包括高并发使用wechatpy,微信component_access_token超过使用问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在昨天,生产环境突然触发了更新component_access_token接口调用次数上限的报错

Error code: 45009, message: reach max api daily quota limit rid: 6139bc19-2de4117b-71b08397

当时一脸懵逼,主要因为使用wechatpy时看了源码,他对component_access_token进行了处理,1小时59分会更新.

先看代码:

 从这两部分代码来看,SDK会在没有component_access_token的更新,并且存入session,然后会在使用的时候进行验证,在最后1小时59的时候,如果有使用就会去更新.

咋的一看,没啥问题啊.怎么会使用超过调用次数呢.

再来看看背景:

1.生产环境使用框架是基于tornado的异步框架.sdk使用的session为线上的redis,并未使用memorystorage

在这样的背景下,由于sdk为同步,所以使用了同步的redis库.但是在调用sdk函数进行业务处理时使用了同步转异步的方式.

问题就出在这两个地方.在创建同步redis时,由于开发时最大连接数设置的为8,上线到生产环境也为8.这里为高并发时出问题埋下了伏笔.

在高并发时,大量的极短的时间调用第二个图中的函数时,去redis当中取component_access_token时会发生两种情况:

component_access_token此时没有:此时瞬间8个连接被占满,去获取 component_access_token,但是获取是空,然后就会去请求,在第一个图中的函数为请求后,进行存储到redis.

但是问题是此时8个连接已被占满,set也处理不了,所有的人都会造成没component_access_token可用,就会不断的刷新.造成获取component_access_token接口大量的被调用.

component_access_token有时,当连接数被占满,由于连接数只有8,所以几个人就可以占满连接池,导致其他人获取不到component_access_token,也会去刷.

导致了高并发使用wechatpy,微信component_access_token超过使用问题.

原文地址:https://www.cnblogs.com/bobby-x/p/15250779.html