使用 goroutines 进行退避处理
Backoff handling with goroutines
一个程序使用 N 个并发工作程序作为从通道(Producer/Consumer 模式)消费数据的 goroutine 将数据发送到 API。 API 表示它无法使用 HTTP 状态代码处理更多并要求退避。
- 如何在退避间隔结束之前阻止所有工作程序?
- 我将重试失败的请求放在哪里?
非常感谢任何 links/pointers 这个可能已经解决的问题!
您可以使用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
}
}
设置如下:
- 将相同的退避通道传递给所有 go 例程
- 设置退避持续时间。这很棘手,因为所有 go 例程都应该能够设置这个值,并且所有其他例程都应该能够读取它。一种方法可以使用闭包
一旦设置了这两个,您就可以通过操纵退避通道和 backoffDuration 来控制 API 调用,以控制例程暂停工作的时间。
免责声明:这只是伪代码。
您可以查看 Hashicorp 的图书馆 here。看起来它会解决你的问题
一个程序使用 N 个并发工作程序作为从通道(Producer/Consumer 模式)消费数据的 goroutine 将数据发送到 API。 API 表示它无法使用 HTTP 状态代码处理更多并要求退避。
- 如何在退避间隔结束之前阻止所有工作程序?
- 我将重试失败的请求放在哪里?
非常感谢任何 links/pointers 这个可能已经解决的问题!
您可以使用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
}
}
设置如下:
- 将相同的退避通道传递给所有 go 例程
- 设置退避持续时间。这很棘手,因为所有 go 例程都应该能够设置这个值,并且所有其他例程都应该能够读取它。一种方法可以使用闭包
一旦设置了这两个,您就可以通过操纵退避通道和 backoffDuration 来控制 API 调用,以控制例程暂停工作的时间。
免责声明:这只是伪代码。
您可以查看 Hashicorp 的图书馆 here。看起来它会解决你的问题