如何解决API响应时间变慢的问题,当数据库看起来正常
上个月,我有一个生产API,看起来在所有错误的地方都很健康。CPU使用率很低,PostgreSQL没有显示锁等待,并且在早晨流量激增期间,端点仍然返回2到4秒的p95。但是令人沮丧的是,单个手动请求在暂存环境中返回速度很快,所以第一反应是责怪网络或CDN。 我首先从慢速请求中提取跟踪ID,而不是查看平均延迟。在APM中,控制器本身很轻,但每个请求都执行了相同的小查找80到120次。ORM代码看起来很无害,因为它在一个帮助函数中,用于格式化每行的账户状态。在20行页面下,它变成了N+1查询模式,数据库看起来"正常",因为每个单独的查询都很廉价。 解决方案不是大幅重写。我添加了一个批量查询,按account_id键,移动格式化器以在内存中使用Map,并在account_status(account_id,effective_at desc)上添加了一个复合索引,因为批量查询仍然需要最新的状态…