首页 > 解决方案 > 使用重试逻辑模拟 HTTP 请求成功或失败

问题描述

我想用 http 模拟重试选项,例如:

  1. 前两次 http 尝试出错(使用一些错误的 url)
  2. 第三个成功(带有有效的网址)

这有点棘手,知道怎么做吗?我尝试在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
}

标签: algorithmgo

解决方案


推荐阅读