У меня есть случай, когда клиент Go с наблюдателем файлов прослушивает изменения в файле и отправляет эти изменения на сервер Go. Если Клиент не может связаться с сервером во время POST
запросов с полезной нагрузкой изменений файла, Клиент будет каждые 3 секунды пытаться отправить запрос, пока err := http.NewRequest()
не вернет не ноль err
Но если клиент в настоящее время пытается каждые 3 секунды отправлять запрос POST
, но в то же время происходит новое изменение в файле под наблюдением файла, я хочу, чтобы полезная нагрузка текущих POST
запросов была равна быть перезаписан новой полезной нагрузкой (новые изменения из файла)
Как мне архивировать это лучше?
Клиентский код для отправки HTTP-запросов
func makeRequest(method string, body io.Reader) (*http.Response, error) {
client := &http.Client{}
request, err := http.NewRequest(.., .., ..)
if err != nil {
log.Println("Error: Couldn't make a new Request:", err)
return nil, err
}
response, err := client.Do(request)
if err != nil {
log.Printf("Error: Couldn't execute %s request:%s", method, err)
}
return response, err
}
Функция, которая повторяется до err! = Nil
func autoRetry(f func() error) {
if err := backoff.Retry(f, getBackOff()); err != nil {
log.Println("Error: Couldn't execute exponential backOff retries: ", err)
}
}
autoRetry()
- это просто функция, которая принимает функцию и использует ExponentialBackOff для вычисления количества попыток до err !=nil
Вызов метод, выполняющий запрос POST с повторными попытками
func postTodo() {
autoRetry(func() error {
r, err := makeRequest("POST", getFileData())
if err != nil {
return err
}
if r.StatusCode != 200 {
return errors.New("Error:" + r.Status)
}
return nil
})
}