在昨天,生产环境突然触发了更新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超过使用问题.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。