使用Go重试机制代码更可靠

 更新时间:2022年08月22日 08:56:31   作者:六号积极分子  
这篇文章主要为大家介绍了使用Go重试机制的使用,使你的代码更加可靠,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

场景

服务依赖第三方服务或者其他服务,但有时第三方服务偶发性出现问题并且会快速的恢复,而我们的系统可能因为这些偶发性出现问题。

所以无法保证以来服务的可靠性,但是我们可以通过其他的方式来保证我们的服务是稳定的,可靠的。

重试机制可以协助我们构建健壮的服务。比如调用第三方服务或执行某操作时,出现执行失败,我们可以让其再重试几次再抛出错误。

设计原理

重试机制:某方法或者函数执行失败了重新执行,尝试重新执行后,尝试几次失败后结束。期间成功一次则表示成功。

  • 重试次数
  • 需要被重新执行方法
func add() (string, error) {
    var i = 1
    var j = 2
    result := i + j
    return strconv.Itoa(result), nil
}
func RetryFunc(count int, cback func() (string, error)) {
    for i := 0; i < count; i++ {
        result, err := cback()
        if err == nil {
            return result
        }
    }
}
// 应用
package main
func main(){
    Retry(3, add)
}

重试函数接收2个参数,一个是重试次数,一个是需要重新执行的函数。但函数都是固定的。可以进一步优化。

type Effector func(context.Context) (string, error)
func Retry(count int ,delay time.Duration, effector){
    return func(ctx. context.Context)(string, error){
        for r:=0; ;r++{
            response, err := effector()
            if err == nil || r>= count {
                return  response, err
             }
            fmt.Printf("Function call failed, retrying in %v", delay)
            select {
                case <- time.After(delay)
                case <- ctx.Done():
                    return "", ctx.Err()
            }
        }
    }
}

增加延时参数 delay 控制重试延时 ,使用匿名函数定义一个函数接收器,返回值为匿名函数的。所以重试函数接受三个参数:一个效应器,一个整数,描述函数重试传递的效应器的次数以及重试之间的延迟。

函数接收器的参数是 context ,context 主要用来在 goroutine 之间传递上下文信息。这里使用context主要是用于超时取消,然后快速返回。 context包主要提供了两种方式创建context:

context.Background 是上下文的默认值,所有其他的上下文都应该从它衍生(Derived)出来。

context.TODO 应该只在不确定应该使用哪种上下文时使用;

以上就是使用Go重试机制代码更可靠的详细内容,更多关于Go重试机制的资料请关注脚本之家其它相关文章!

相关文章

  • Go 中烧脑的接口及空接口

    Go 中烧脑的接口及空接口

    在Go语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构的核心,这篇文章主要介绍了Go 中烧脑的接口,需要的朋友可以参考下
    2024-02-02
  • Golang多线程排序实现快速高效地处理大规模数据

    Golang多线程排序实现快速高效地处理大规模数据

    Golang多线程排序是一种快速高效地处理大规模数据的方法,通过使用Golang的协程和通道,可以将排序任务分配到多个线程中并行处理,提高了排序的效率和速度,需要详细了解可以参考下文
    2023-05-05
  • Go语言实现的一个简单Web服务器

    Go语言实现的一个简单Web服务器

    这篇文章主要介绍了Go语言实现的一个简单Web服务器,本文先是给出一个使用http包建立的Web服务器源码,并对比了其它编程语言,需要的朋友可以参考下
    2014-10-10
  • golang解析域名的步骤全纪录

    golang解析域名的步骤全纪录

    这篇文章主要给大家介绍了利用golang如何解析域名的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-12-12
  • Golang爬虫及正则表达式的实现示例

    Golang爬虫及正则表达式的实现示例

    本文主要介绍了Golang爬虫及正则表达式的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Golang Gin框架实现多种数据格式返回结果详解

    Golang Gin框架实现多种数据格式返回结果详解

    这篇文章主要介绍了Golang Gin框架实现多种数据格式返回结果,我们都知道,一个完整的请求包含请求和处理请求以及结果返回三个步骤,在服务器端对请求处理完成以后,会将结果返回给客户端,在gin框架中,支持返回多种请求数据格式,下面我们一起来看看
    2023-05-05
  • Gin+Gorm实现CRUD的实战

    Gin+Gorm实现CRUD的实战

    本文主要介绍了Gin+Gorm实现CRUD的实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Go编译原理之函数内联

    Go编译原理之函数内联

    这篇文章主要为大家介绍了Go编译原理之函数内联示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Golang 内存模型详解(一)

    Golang 内存模型详解(一)

    这篇文章主要介绍了Golang 内存模型详解(一),本文讲解了Go内存模型interface、,需要的朋友可以参考下
    2014-10-10
  • 掌握GoLang Fiber路由和中间件技术进行高效Web开发

    掌握GoLang Fiber路由和中间件技术进行高效Web开发

    这篇文章主要为大家介绍了GoLang Fiber路由和中间件进行高效Web开发,本文将深入探讨 Fiber 中的路由细节,学习如何创建和处理路由,深入了解使用路由参数的动态路由,并掌握在 Fiber 应用程序中实现中间件的艺术
    2024-01-01

最新评论