高并发使用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
- Python学习笔记(4):自定义时间类
- Mysql备份系列(3)--innobackupex备份mysql大数据(全量+增量)操作记录
- 微信小程序开发:设置消息推送
- Mysql备份系列(1)--备份方案总结性梳理
- ASP.NET中常用的优化性能的方法(转贴,Icyer收集整理)
- 顶象全场景IoT安全方案解决物联网两大难题
- 诡异的【session丢失】和【<img src="">标签】
- TensorFlow核心使用要点
- “搜一搜”直达生活服务 微信连接移动消费新场景
- Linux服务器安全登录设置记录
- Linux系统下的ssh使用(依据个人经验总结)
- 从MapX到MapXtreme2004[4]-标注AutoLabel
- Linux下锁定账号,禁止登录系统的设置总结
- 深度解析 TypeConverter & TypeConverterAttribute (一)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法