【问题标题】:Backoff handling with goroutines使用 goroutine 处理退避
【发布时间】:2020-05-12 17:29:20
【问题描述】:

一个程序将数据发送到 API,使用 N 个并发工作程序作为从通道消费数据的 goroutine(生产者/消费者模式)。 API 表示它无法使用 HTTP 状态代码处理更多,并要求退避。

  1. 如何在退避间隔过去之前阻止所有工作人员?
  2. 我把那些重试失败的请求放在哪里?

非常感谢任何指向这个可能已经解决的问题的链接/指针!

【问题讨论】:

    标签: go goroutine exponential-backoff


    【解决方案1】:

    您可以使用select来控制调用API

    for _, k := range data {
        select {
            case <- backoff:
                time.Sleep(backoffDuration)
        default:
            // Call API
            // Check http status code and trigger backoff channel
            backoff <- 1
        }
    }
    

    设置如下:

    1. 将相同的退避通道传递给所有 goroutine
    2. 设置退避持续时间。这很棘手,因为所有 go 例程都应该能够设置此值,而所有其他例程都应该能够读取它。一种方法是使用闭包

    设置这两个后,您可以通过操纵退避通道和退避持续时间来控制 API 调用,以控制例程暂停工作的时间。

    免责声明:这只是伪代码。

    您可以查看 Hashicorp 的图书馆 here。看起来它会解决你的问题

    【讨论】:

      猜你喜欢
      • 2017-02-28
      • 1970-01-01
      • 2013-03-27
      • 2015-04-28
      • 2017-04-10
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多