使用aws-sdk调用Cognito查询接口耗时超700ms如何优化?
Cognito查询接口延迟优化方案
代码侧优化
- 全局复用Cognito实例
不要在路由处理逻辑中重复初始化CognitoIdentityServiceProvider实例,将实例初始化移到模块顶层,全局复用连接,避免每次请求重新建立TCP连接产生的开销。 - 启用AWS SDK HTTP长连接
你当前使用的是AWS SDK v2,默认没有开启HTTP Keep-Alive,每次请求都会重新握手,增加延迟,调整初始化配置即可:import AWS from 'aws-sdk'; import https from 'https'; const Cognito = new AWS.CognitoIdentityServiceProvider({ region: '你的Cognito区域', accessKeyId: '...', secretAccessKey: '...', // 新增以下配置启用长连接 httpOptions: { agent: new https.Agent({ keepAlive: true, maxSockets: 50, // 根据你的并发量调整 rejectUnauthorized: true }) } }); - 优先本地解析JWT令牌(收益最高)
大部分场景下调用getUser接口只是为了获取AccessToken中携带的用户声明、验证令牌有效性,这种情况完全不需要调用Cognito远端接口,直接本地验证解析JWT即可,耗时可以从700ms降到10ms以内。
你可以通过jsonwebtoken、jwks-rsa库获取Cognito公钥后本地验证令牌,仅当需要获取用户最新属性、确认令牌是否被吊销时,再调用Cognito接口。 - 增加热点用户数据缓存
对于高频查询的用户数据,可以在服务侧增加Redis或内存缓存,缓存过期时间设置为小于令牌有效期(例如3-5分钟),相同用户的重复请求直接走缓存返回,避免重复调用Cognito接口。
AWS侧配置优化
- 确保服务和Cognito同区域部署
检查你的Express服务部署的AWS区域,必须和Cognito用户池所属区域完全一致,跨区域请求会带来至少几百ms的额外公网延迟。 - 配置Cognito VPC端点
如果你的Express服务部署在AWS VPC内,可配置Cognito的接口型VPC端点,调用Cognito的请求会直接走AWS内部私有网络,不需要绕行公网,可降低30%以上的网络延迟,同时提升安全性。 - 排查Cognito触发器开销
检查你的Cognito用户池是否配置了预令牌生成、身份验证等Lambda触发器,这些触发器会在调用getUser等接口时同步执行,如果触发器本身执行耗时较高,会直接体现在接口返回延迟上,可优化触发器代码性能或关闭不必要的触发器。 - 调整服务出口网络配置
如果你的服务部署在AWS外,可考虑使用AWS Global Accelerator优化到Cognito区域的公网链路,降低公网传输抖动和延迟。
内容的提问来源于stack exchange,提问作者Joaquim Flávio Almeida Quirino
相关产品推荐
相关产品推荐

