用goroutines处理后退

问题描述 投票:0回答:1

一个程序使用N个并发的worker作为goroutine向API发送数据,这些worker从一个通道中消耗数据(ProducerConsumer模式)。API使用HTTP状态码发出无法处理更多数据的信号,并要求后退。

  1. 我如何封锁所有的工作者,直到回退的时间间隔过去?
  2. 我把那些失败的请求放在哪里重试?

如果有任何关于这个可能已经解决的问题的链接,我将非常感激。

go goroutine exponential-backoff
1个回答
1
投票

你可以使用选择来控制调用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. 把相同的后退通道传给所有的程序
  2. 设置backoffDuration。这一点很棘手,因为所有的go例程都应该能够设置这个值,而其他所有的例程都应该能够读取它。一种方法是使用闭包

一旦这两个设置完成,你就可以通过操作backoff channel和backoffDuration来控制API调用,从而控制例程暂停工作的时间。

声明:这只是伪代码。

你可以查看Hashicorp的库。此处. 看起来它可以解决你的问题

© www.soinside.com 2019 - 2024. All rights reserved.