使用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重试机制的资料请关注脚本之家其它相关文章!

相关文章

  • Golang处理gRPC请求/响应元数据的示例代码

    Golang处理gRPC请求/响应元数据的示例代码

    前段时间实现内部gRPC框架时,为了实现在服务端拦截器中打印请求及响应的头部信息,便查阅了部分关于元数据的资料,因为中文网络上对于该领域的信息较少,于是在这做了一些简单的总结,需要的朋友可以参考下
    2024-03-03
  • go语言中的map如何解决散列性能下降

    go语言中的map如何解决散列性能下降

    近期对go语言的map进行深入了解和探究,其中关于map解决大量冲突的扩容操作设计的十分巧妙,所以笔者特地整理了这篇文章来探讨一下go语言中map如何解决散列性能下降,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-03-03
  • Golang高性能持久化解决方案BoltDB数据库介绍

    Golang高性能持久化解决方案BoltDB数据库介绍

    这篇文章主要为大家介绍了Golang高性能持久化解决方案BoltDB数据库介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Golang学习笔记(一):简介

    Golang学习笔记(一):简介

    这篇文章主要介绍了Golang学习笔记(一):简介,本文讲解了Go语言最主要的特性、安装、环境变量设置、整体目录结构、Helloworld、go命令、调试、编辑器设置等内容,需要的朋友可以参考下
    2015-05-05
  • 详解Go语言中切片的长度与容量的区别

    详解Go语言中切片的长度与容量的区别

    切片可以看成是数组的引用,切片的长度是它所包含的元素个数。切片的容量是从它的第一个元素到其底层数组元素末尾的个数。本文将通过示例详细讲讲Go语言中切片的长度与容量的区别,需要的可以参考一下
    2022-11-11
  • Go多线程中数据不一致问题的解决方案(sync锁机制)

    Go多线程中数据不一致问题的解决方案(sync锁机制)

    在Go语言的并发编程中,如何确保多个goroutine安全地访问共享资源是一个关键问题,Go语言提供了sync包,其中包含了多种同步原语,用于解决并发编程中的同步问题,本文将详细介绍sync包中的锁机制,需要的朋友可以参考下
    2024-10-10
  • Go字符串操作深入解析

    Go字符串操作深入解析

    这篇文章主要为大家介绍了Go字符串操作深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • GoLang BoltDB数据库详解

    GoLang BoltDB数据库详解

    这篇文章主要介绍了GoLang BoltDB数据库,boltdb是使用Go语言编写的开源的键值对数据库,boltdb存储数据时 key和value都要求是字节数据,此处需要使用到 序列化和反序列化
    2023-02-02
  • GO的range如何使用详解

    GO的range如何使用详解

    本文主要介绍了GO的range如何使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 源码剖析Golang中singleflight的应用

    源码剖析Golang中singleflight的应用

    这篇文章主要为大家详细介绍了如何利用singleflight来避免缓存击穿,并剖析singleflight包的源码实现和工作原理,感兴趣的可以了解下
    2024-03-03

最新评论