知识卡片

超时之后请求可能仍在原地执行

专业/工作 · 524.c.1

内容

调用方设置的超时只约束”我愿意等多久”,完全不影响被调用方那边的处理进度——超时触发、调用方放弃等待返回失败之后,下游服务很可能仍在继续处理这个请求,甚至最终处理成功了,只是响应没能在超时窗口内赶回来。对读操作(查询)来说这无所谓,反正是幂等的,超时了大不了重新查一次;但对写操作(下单、扣款)来说这是个真实的风险——调用方以为失败了准备重试或提示用户失败,下游其实已经把这次操作执行完了,重试就可能造成重复下单、重复扣款这类不一致状态。发散:这提醒了一个容易被忽略的心智误区——”客户端超时了”和”服务端没处理”完全是两码事,客户端只能观测到”我没等到回应”,观测不到”对方到底做没做”,任何依赖超时来判断操作是否发生的逻辑都是不可靠的,写操作必须额外考虑幂等键之类的机制才能安全重试。

参考来源

《Cloud Native Spring in Action》第8章《Reactive Spring: Resilience and scalability》