go优雅重试

实现思路:

  1. 重试配置定义最大重试次数和固定重试间隔;
  2. 使用接口优雅传递可选重试配置参数;
  3. 重试的模板方法必须返回错误,且只有一个返回值;
  4. 如果需要使用被重试方法的返回值,使用匿名方法包一层真实方法并在匿名方法中赋值真实方法的返回值;
  5. 真实方法返回error时会进行重试;
    重试配置
// 重试配置结构
type Config struct  {
	 MaxRetryTime int // 最大重试次数
	 Interval 	  int // 固定重试间隔
}

// 构造默认重试配置
func NewDefaultConfig() *Config {
	return &Config {
		MaxRetryTime : DefaultMaxRetryTime,
		Interval : DefaultInterval,
	}
}

// 默认重试配置常量
const (
	DefaultMaxRetryTime = 3 // 默认最大重试次数
	DefaultInterval     = 1 // 默认重试间隔(单位秒)
)

// 定义重试参数接口
type Option func(*Config)

// 设定重试参数方法-超时时间
func MaxRetryTime(maxRetryTime int) Option {
	return func(config *Config) {
		config.MaxRetryTime = maxRetryTime
	}
}

// 设定重试参数方法-重试间隔
func Interval(interval int) Option {
	return func(config *Config) {
		config.Interval = interval
	}
}

通用重试方法

// 重试模板方法定义,必须返回错误,且只有一个返回值
type RetryFunc func() error

// 接受重试方法和可选重试参数(重试次数、重试间隔)
func DO(f RetryFunc, options...Option) error{
	// 构造默认重试配置
	config := NewDefaultConfig()
	for i :=range options {
		options[i](config)
	}
	// 接受方法返回错误
	var err error
	for i := 0;i < config.MaxRetryTime ;i++ { 
		err = f()
		fmt.Printf("第%d次执行 结果%v\n",i+1, err)
		if err == nil {
			// 执行成功返回
			return nil
		}
		// 发生错误,延迟重试间隔
		time.Sleep(time.Duration(config.Interval) * time.Second)
	}

	return err
}

测试方法

// 获取商和余数
func GetShangAndYushu(a int, b int) (int, int, error) {
	val1 := a/b
	val2 := a %b
	return val1, val2, errors.New("手动触发错误") 
	// return val1, val2, nil
}

使用示例

func main() {
	var shang int // 商
	var yushu int // 余数
	var err error 
	DO(func () error {
		shang, yushu, err = GetShangAndYushu(2,1)
		return err
	}, MaxRetryTime(10), Interval(2)) 
	fmt.Printf("最终结果err=%v,shang=%d,yushu=%d\n", err,shang,yushu)
}

结果展示

第1次执行 结果手动触发错误
第2次执行 结果手动触发错误
第3次执行 结果手动触发错误
第4次执行 结果手动触发错误
第5次执行 结果手动触发错误
第6次执行 结果手动触发错误
第7次执行 结果手动触发错误
^@第8次执行 结果手动触发错误
第9次执行 结果手动触发错误
第10次执行 结果手动触发错误
最终结果err=手动触发错误,shang=2,yushu=0

相关推荐

  1. go优雅

    2024-03-13 22:42:03       15 阅读
  2. 8. Go实现Gin服务优雅关机与

    2024-03-13 22:42:03       18 阅读
  3. Python

    2024-03-13 22:42:03       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-13 22:42:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-13 22:42:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-13 22:42:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-13 22:42:03       20 阅读

热门阅读

  1. vue从零到一创建项目?

    2024-03-13 22:42:03       20 阅读
  2. python 基础练习题

    2024-03-13 22:42:03       14 阅读
  3. ElasticSearch 搜索推荐

    2024-03-13 22:42:03       20 阅读
  4. ES6 类的扩展

    2024-03-13 22:42:03       17 阅读
  5. js的事件有哪些?

    2024-03-13 22:42:03       19 阅读
  6. Android adb启动app方式

    2024-03-13 22:42:03       19 阅读
  7. 【SpringBoot】多环境切换的灵活配置

    2024-03-13 22:42:03       24 阅读
  8. 车联网术语汇总 车联网术语汇总

    2024-03-13 22:42:03       19 阅读