admin管理员组

文章数量:1037775

瞧瞧别人家的接口重试,那叫一个优雅!

大家好,我是苏三,又跟大家见面了。

前言

记得五年前的一个深夜,某个电商平台的订单退款接口突发异常,因为银行系统网络抖动,退款请求连续失败。

原本技术团队只是想“好心重试几次”,结果开发小哥写的重试代码竟疯狂调用了银行的退款接口 82次

最终导致用户账户重复退款,平台损失过百万。

老板在复盘会上质问:“接口重试这么基础的事,为什么还能捅出大篓子?”

大家哑口无言,因为所有人都以为只要加个 for 循环,再睡几秒就完事了……

这篇文章跟大家一起聊聊重试的7种常用方案,希望对你会有所帮助。

1 暴力轮回法

问题场景

某实习生写的用户注册短信发送接口。

在一个while循环中,重复调用第三方的发短信接口给用户发送短信。

代码如下:

代码语言:javascript代码运行次数:0运行复制
public void sendSms(String phone) {
    int retry = 0;
    while (retry < 5) { // 无脑循环
        try {
            smsClient.send(phone);
            break;
        } catch (Exception e) {
            retry++;
            Thread.sleep(1000); // 固定1秒睡眠
        }
    }
}

事故现场

某次短信服务器出现了过载问题,导致所有请求都延迟了3秒。

这个暴力循环的代码在 0.5秒内同时发起数万次重试,直接打爆短信平台,触发了 熔断封禁,连正常请求也被拒绝。

教训

  • 瞧瞧别人家的接口重试,那叫一个优雅!

    大家好,我是苏三,又跟大家见面了。

    前言

    记得五年前的一个深夜,某个电商平台的订单退款接口突发异常,因为银行系统网络抖动,退款请求连续失败。

    原本技术团队只是想“好心重试几次”,结果开发小哥写的重试代码竟疯狂调用了银行的退款接口 82次

    最终导致用户账户重复退款,平台损失过百万。

    老板在复盘会上质问:“接口重试这么基础的事,为什么还能捅出大篓子?”

    大家哑口无言,因为所有人都以为只要加个 for 循环,再睡几秒就完事了……

    这篇文章跟大家一起聊聊重试的7种常用方案,希望对你会有所帮助。

    1 暴力轮回法

    问题场景

    某实习生写的用户注册短信发送接口。

    在一个while循环中,重复调用第三方的发短信接口给用户发送短信。

    代码如下:

    代码语言:javascript代码运行次数:0运行复制
    public void sendSms(String phone) {
        int retry = 0;
        while (retry < 5) { // 无脑循环
            try {
                smsClient.send(phone);
                break;
            } catch (Exception e) {
                retry++;
                Thread.sleep(1000); // 固定1秒睡眠
            }
        }
    }
    

    事故现场

    某次短信服务器出现了过载问题,导致所有请求都延迟了3秒。

    这个暴力循环的代码在 0.5秒内同时发起数万次重试,直接打爆短信平台,触发了 熔断封禁,连正常请求也被拒绝。

    教训