服务器重启后新建API报Cannot POST 需调用旧API才可正常访问
故障现象
- 服务器重启后直接调用新增的
create-payment-intentPOST接口,返回报错:
Cannot POST /payment/create-payment-intent
- 先调用任意存量旧接口(例如
getAllPaymentDetails)后,新接口即可恢复正常响应 - 测试环境偶发,约每两次调用出现一次失败
- 接口正常时的预期响应如下:
{ "status": 200, "response": { "clientSecret": "pi_3LL4ixSIj3b4yMU7_secret_4MJvyA39NRp80zDi" } }
可能的故障原因
- 路由懒加载逻辑设计缺陷
新接口所属的业务模块(从路径看是支付模块)做了懒加载设计,路由没有在服务启动阶段同步注册到路由表,而是被放在了模块首次被调用的触发逻辑里。存量旧接口刚好属于同一个业务模块,第一次调用旧接口时会触发模块初始化,完成新接口的路由挂载,后续请求就能正常匹配。如果是多实例部署,各实例的模块初始化状态不同,流量随机分发时就会出现五成左右的调用成功率。 - 多实例部署版本不一致+粘性会话策略
测试环境部署了多个服务实例,部分实例没有更新到包含新接口的代码版本。负载均衡默认按轮询策略分发流量时,请求打到旧版本实例就会报路由不存在,打到新版本实例就正常。如果负载均衡开启了来源IP粘性会话,第一次调用旧接口时如果流量被分到运行新版本的实例,后续所有请求都会被转发到这台正常实例,就会表现出“调用一次旧接口后新接口恢复正常”的现象。 - 框架初始化顺序错误
服务启动时存在异步初始化逻辑(比如数据库连接、配置中心拉取配置、依赖注入容器加载),新接口的路由注册逻辑被错误放在了异步初始化的回调中,没有和存量接口一样在启动同步阶段完成注册。服务刚启动完成时,异步逻辑可能还没执行完,路由表缺失新接口规则;第一个请求打到服务时会触发等待异步逻辑完成,顺带完成路由注册。如果异步初始化存在竞态条件,就会出现偶发的注册成功/失败情况。 - 路由表加载顺序冲突
/payment路径下存在通配符路由、动态参数路由或者其他和新接口路径规则重合的路由,服务刚启动时路由表的加载顺序不稳定,优先级更高的通配符/错误路由先匹配到请求,直接返回404类错误;第一次请求进入后框架会重新排序路由规则,精确匹配的新接口路由优先级提升,后续请求就能正常命中。 - 网关层路由缓存/同步延迟
服务前端部署了Nginx、API网关等代理层,网关从服务注册中心同步路由存在延迟,服务刚重启完成时网关还没拉取到新接口的路由信息,直接拦截请求返回POST方法不允许的错误。调用旧接口时网关会和后端服务建立长连接、触发路由表同步,同步完成后新接口的请求就能正常转发。多实例场景下网关到各实例的路由同步进度不一致,就会出现偶发报错。
内容的提问来源于stack exchange,提问作者Priyanshu Gupta
相关产品推荐
相关产品推荐

