algorithm - 使用重试逻辑模拟 HTTP 请求成功或失败
问题描述
我想用 http 模拟重试选项,例如:
- 前两次 http 尝试出错(使用一些错误的 url)
- 第三个成功(带有有效的网址)
这有点棘手,知道怎么做吗?我尝试在doSomething
具有不同 url 的方法上使用循环,但它没有说明这一点,例如,重试至少 3 次,直到获得 http 200,(成功)知道如何模拟它吗?
可能在以下循环中运行...
www.stackoverflow.com2
www.stackoverflow.com1
www.stackoverflow.com
https://play.golang.org/p/dblPh1T0XBu
package main
import (
`fmt`
`log`
"net/http"
`time`
`github.com/cenkalti/backoff/v4`
)
func main() {
b := backoff.NewExponentialBackOff()
b.MaxElapsedTime = 3 * time.Second
retryable := func() error {
val, err := doSomething("https://www.google.com1")
if err != nil {
return err
}
fmt.Println(val)
return nil
}
notify := func(err error, t time.Duration) {
log.Printf("error: %v happened at time: %v", err, t)
}
err := backoff.RetryNotify(retryable, b, notify)
if err != nil {
fmt.Errorf("error after retrying: %v", err)
}
}
func doSomething(url string) (int, error) {
res, e := http.Get(url)
if e != nil {
fmt.Println("error occurred: ", e)
return 500, e
}
return res.StatusCode, nil
}
下面评论的想法是问题的一部分,我需要使用http调用 https://play.golang.org/p/FTR7J2r-QB7
package main
import (
`fmt`
`log`
`time`
`github.com/cenkalti/backoff/v4`
)
func main() {
b := backoff.NewExponentialBackOff()
b.MaxElapsedTime = 3 * time.Second
retrybuilder := func (count int) func() error {
return func() error {
var succeed bool
count -= 1
if count == 0 {
succeed = true
}
val, err := doSomething(succeed)
if err != nil {
fmt.Println("response: ", val)
}
return err
}
}
notify := func(err error, t time.Duration) {
log.Printf("error: %v happened at time: %v", err, t)
}
err := backoff.RetryNotify(retrybuilder(3), b, notify)
if err != nil {
fmt.Printf("error after retrying: %v", err)
}
}
func doSomething(succeed bool) (int, error) {
if !succeed {
return 500, fmt.Errorf("E_SIMULATED: sim error")
}
return 200, nil
}
解决方案
推荐阅读
- r - 使用 map 函数进行子集化
- shiny - 绑定数据的闪亮应用只保存一个名字
- react-native-popup-menu - 使用 react-native-popup-menu 实现多级弹出窗口的理想方法是什么?
- micronaut - 如何使用 LogBack 记录客户端 IP 地址
- json - 如何在 Laravel Eloquent 中获取包含数组的 JSON 对象的值?
- azure - 在 Azure 数据工厂中将固定宽度文件转换为分隔文件 - 映射数据流
- android - 如何在 Android 中获取 ML Kit 人脸检测处理帧
- python - 免费计划中的 Firebase 存储:要计费的项目与缺少的计费帐户相关联
- node.js - AWS-SDK 上传到 S3 >1GB 文件
- javascript - 如何在具有子 DIV 的 DIV 上使用 Javascript onmouseout