惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
Security Latest
Security Latest
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
The Register - Security
The Register - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
罗磊的独立博客
MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
博客园 - 叶小钗
H
Help Net Security
大猫的无限游戏
大猫的无限游戏
U
Unit 42
G
Google Developers Blog
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
PCI Perspectives
PCI Perspectives
The Last Watchdog
The Last Watchdog
有赞技术团队
有赞技术团队
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News and Events Feed by Topic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Application and Cybersecurity Blog
Application and Cybersecurity Blog
雷峰网
雷峰网
SecWiki News
SecWiki News
Google Online Security Blog
Google Online Security Blog
S
Security @ Cisco Blogs
N
News | PayPal Newsroom
The Hacker News
The Hacker News
月光博客
月光博客
T
Threatpost
B
Blog
P
Proofpoint News Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Simon Willison's Weblog
Simon Willison's Weblog
P
Palo Alto Networks Blog
L
LangChain Blog
Scott Helme
Scott Helme
Last Week in AI
Last Week in AI
C
Check Point Blog
P
Privacy International News Feed

二丫讲梵

学习周刊-总第258期-2026年第15周 学习周刊-总第257期-2026年第14周 学习周刊-总第256期-2026年第13周 学习周刊-总第255期-2026年第12周 学习周刊-总第254期-2026年第11周 学习周刊-总第253期-2026年第10周 临时插播一条羊毛,免费领取450元大模型API代金券 学习周刊-总第252期-2026年第09周 学习周刊-总第251期-2026年第08周 学习周刊-总第250期-2026年第07周 学习周刊-总第249期-2026年第06周 诚邀评论,聊聊你所知欲知的我 学习周刊-总第248期-2026年第05周 我的QQ动态之2015年 我的QQ动态之2014年 我的QQ动态之2013年 我的QQ动态之2012年 我的QQ动态-2010-2011年 我的QQ动态-创栏小叙 学习周刊-总第247期-2026年第04周 Nexus社区版权益阉割--一文告诉你有哪些版本可以选择 学习周刊-总第246期-2026年第03周 学习周刊-总第245期-2026年第02周 学习周刊-总第244期-2026年第01周 学习周刊-总第243期-2025年第52周 学习周刊-总第242期-2025年第51周 开源项目ZenOps:带你领略禅意运维 学习周刊-总第241期-2025年第50周 用京东金融,享负债人生 学习周刊-总第240期-2025年第49周 学习周刊-总第239期-2025年第48周 整理我在静态服务透明代理上的极致求索之路,最后一个你绝想不到 学习周刊-总第238期-2025年第47周 我们输了,但收获颇多 太多了,太多了 学习周刊-总第237期-2025年第46周 学习周刊-总第236期-2025年第45周 学习周刊-总第235期-2025年第44周 二五年国庆二三事 学习周刊-总第234期-2025年第43周 学习周刊-总第233期-2025年第42周 学习周刊-总第232期-2025年第41周 学习周刊-总第231期-2025年第40周 学习周刊-总第230期-2025年第39周 西湖毅行 2025年开源世界逸闻三则 学习周刊-总第229期-2025年第38周 手抄《与妻书》 CNB开发与构建基于docker-cache缓存复用的配置实践心得 学习周刊-总第228期-2025年第37周 父亲善行录 学习周刊-总第227期-2025年第36周 带你认识我之看看我的高中同学录(其二) 学习周刊-总第226期-2025年第35周 带你认识我之看看我的高中同学录(其一) 认识神级MCP工具系列--用anyquery和数据库交互 学习周刊-总第225期-2025年第34周 学习周刊-总第224期-2025年第33周 学习周刊-总第223期-2025年第32周 学习周刊-总第222期-2025年第31周 学习周刊-总第221期-2025年第30周 CNB云原生开发环境届的瑞士军刀,详解qifei项目 vuepress-vdoing主题配置自建不蒜子统计 学习周刊-总第220期-2025年第29周 写在博客发表文章1000篇的节点 从claude cli的体验聊聊最大的敌人是我们自己的成见 学习周刊-总第219期-2025年第28周 学习周刊-总第218期-2025年第27周 学习周刊-总第217期-2025年第26周 理论正确,事实错误 学习周刊-总第216期-2025年第25周 学习周刊-总第215期-2025年第24周 学习周刊-总第214期-2025年第23周 学习周刊-总第213期-2025年第22周 学习周刊-总第212期-2025年第21周 从赵心童世锦赛夺冠聊聊我的斯诺克情缘 学习周刊-总第211期-2025年第20周 记录二五年五一之短暂回归家庭 学习周刊-总第210期-2025年第19周 学习周刊-总第209期-2025年第18周 学习周刊-总第208期-2025年第17周 Go开发实践之Gin框架将前端的dist目录embed到二进制 学习周刊-总第207期-2025年第16周 近期关于cobra库的一些实践心得总结 学习周刊-总第206期-2025年第15周 我的嗜好--嗑瓜子 记大宝参加幼儿园组织的清明烈士陵园扫墓活动 学习周刊-总第205期-2025年第14周 学习周刊-总第204期-2025年第13周 前端开发小笔记--在数组中给字段添加值与删除字段的操作 学习周刊-总第203期-2025年第12周 人生实苦,何以自渡 学习周刊-总第202期-2025年第11周 近期发现的一些优秀的工具提名(一) 学习周刊-总第201期-2025年第10周 学习周刊-总第200期-2025年第09周 记一次女友喝醉使我忍术破功 爱情风波--一次分手又复合的经历 学习周刊-总第199期-2025年第08周 整理我的信息源
使用retry-go给项目添加重试机制
二丫讲梵 · 2023-03-16 · via 二丫讲梵

# 前言

在编写分布式应用程序时,有时会出现一些短暂的错误,例如网络问题、服务端连接中断等。这些错误可能会导致函数执行失败,但在稍后重新尝试时可能会成功。在这种情况下,我们可以使用重试机制。

retry-go 是一个轻量级的 Golang 库,它使重试代码块变得更加简单。它通过提供一个简单的 API 来实现这一点,这使得开发人员可以在代码中轻松地添加重试逻辑。

- name: retry-go
  desc: 一个提供 retry 能力的 go 库
  avatar: https://avatars2.githubusercontent.com/u/416130?s=460&u=8753e86600e300a9811cdc539aa158deec2e2724&v=4
  link: https://github.com/avast/retry-go
  bgColor: "#ffa8a8"

1
2
3
4
5

# 安装

使用 go get 命令安装 retry-go:

go get github.com/avast/retry-go

1

# 使用

以下是一个使用 retry-go 进行网络重试的示例:

package main

import (
	"fmt"

	"net/http"

	"time"

	"github.com/avast/retry-go"
)

func main() {
	err := retry.Do(
		func() error {
			_, err := http.Get("http://example.com")
			return err
		},
		retry.Delay(time.Second),
		retry.Attempts(3),
		retry.DelayType(retry.FixedDelay),
	)
	if err != nil {
		fmt.Println("请求失败:", err)
	} else {
		fmt.Println("请求成功")
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

在这个例子中,我们使用了http.Get函数来执行 GET 请求。如果请求失败,我们使用 retry-go 重试三次。retry-go 将等待一秒钟,然后再次尝试请求。如果请求成功,代码将继续执行。如果请求仍然失败,它将返回最后一个错误。

# 实际案例

以下通过一个实际案例做一个功能使用上的展示:

package main

import (
	"errors"
	"fmt"
	"math/rand"
	"time"

	"github.com/avast/retry-go"
)

func main() {
	var num int
	var err error
	// 定义一个重试策略
	retryStrategy := []retry.Option{
		retry.Delay(100 * time.Millisecond),
		retry.Attempts(5),
		retry.LastErrorOnly(true),
	}

	// 使用重试策略进行重试
	err = retry.Do(
		func() error {
			num, err = CheckNum()
			if err != nil {
				return err
			}
			return nil
		},
		retryStrategy...)

	if err != nil {
		fmt.Println("Error occurred after 5 retries")
	} else {
		fmt.Println(num)
	}
}

// 生成一个随机数,如果小于50,则返回错误,如果大于50,则返回这个数
func CheckNum() (num int, err error) {
	fmt.Println("start check number")
	rand.Seed(time.Now().UnixNano())
	num = rand.Intn(100)
	if num < 50 {
		fmt.Println(num)
		return 0, errors.New("test error")
	} else {
		return
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

这个示例是可以直接套用在实际项目当中的,将重试策略分离,然后解决对应函数方法出现的异常问题。

函数执行之后,可以看到输出如下:

$ go run main.go
start check number
32
start check number
43
start check number
69

1
2
3
4
5
6
7

关于 option 配置项,这里做一下简单解析:

当使用 retry-go 库时,你可以定义一个重试策略,以决定何时进行重试,以及如何进行重试。以下是一些可以在重试策略中配置的选项:

  • retry.Delay(delay time.Duration) :设置重试之间的延迟时间。可以使用 time.Duration 类型的值,例如 10 * time.Millisecond
  • retry.DelayType(delayType retry.DelayType) :设置重试延迟的类型。可以是 retry.FixedDelay(等待固定的延迟时间)或 retry.BackOffDelay(在每次重试之后加倍延迟时间)。
  • retry.MaxJitter(maxJitter time.Duration) :设置重试延迟的最大抖动时间。可以使用 time.Duration 类型的值,例如 2 * time.Millisecond。默认为 0
  • retry.MaxDelay(maxDelay time.Duration) :设置重试延迟的最大时间。可以使用 time.Duration 类型的值,例如 5 * time.Second。默认为 0,表示没有限制。
  • retry.Attempts(attempts uint) :设置重试次数的最大值。默认为 0,表示没有限制。
  • retry.RetryIf(retryIfFunc retry.RetryIfFunc) :设置一个函数,用于确定是否应该重试。该函数接收一个 error 类型的参数,并返回一个布尔值,表示是否应该重试。默认为 nil,表示始终重试。
  • retry.LastErrorOnly(lastErrorOnly bool) :设置是否只记录最后一次错误。如果设置为 true,则只记录最后一次错误,否则记录所有错误。默认为 false
  • retry.OnRetry(onRetryFunc retry.OnRetryFunc) :设置一个函数,在每次重试之前调用。该函数接收一个 uint 类型的参数,表示已经重试的次数。默认为 nil

# 最后

retry-go 是一个简单易用的重试库,它可以帮助开发人员轻松地添加重试逻辑。它提供了强大的功能,在一些场景当中,你可以考虑使用。

最后的最后: 本文由 GPT 辅助编写,感谢 GPT,以后技术类的文章,可能会经常与之合作。