知识卡片

重试只对幂等操作安全

专业/工作 · 524.d.1

内容

能不能重试一个失败的请求,根本判断标准是这个操作幂不幂等——重复执行会不会改变最终结果。查询类操作天然幂等,重试多少次结果都一样;一部分写操作也是幂等的,比如”把某本书的作者名改成 XX”,改一次和改十次效果相同;但像下单这种操作不是幂等的,[[超时之后请求可能仍在原地执行]]——第一次请求可能已经在下游成功创建了订单,只是响应丢在了半路没传回来,这时候盲目重试就会造成重复下单。发散:重试模式的适用边界因此比看上去更窄——它只该用在”下游服务暂时过载、大概率很快自愈”的场景,如果下游是彻底挂了或者返回的是像 404 这种业务语义明确的正常错误,重试毫无意义,只会浪费资源、拖长用户等待时间;判断该不该重试,先问的不是”失败了要不要再试”,而是”这个操作重复执行安不安全”。

参考来源

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