From 6f4090fcb3e5d3024096bdcc13e171a23e0b2f0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20P=C3=A9rez?= Date: Thu, 30 Oct 2025 15:12:36 +0100 Subject: [PATCH] add backoff --- service_b/go.mod | 5 +++- service_b/go.sum | 2 ++ service_b/internal/domains/meteo/service.go | 31 +++++++++++++++------ 3 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 service_b/go.sum diff --git a/service_b/go.mod b/service_b/go.mod index 5fe644d..7cc9718 100644 --- a/service_b/go.mod +++ b/service_b/go.mod @@ -4,4 +4,7 @@ go 1.25.2 replace pkg => ../pkg -require pkg v0.0.0-00010101000000-000000000000 +require ( + github.com/cenkalti/backoff/v5 v5.0.3 + pkg v0.0.0-00010101000000-000000000000 +) diff --git a/service_b/go.sum b/service_b/go.sum new file mode 100644 index 0000000..a8cc689 --- /dev/null +++ b/service_b/go.sum @@ -0,0 +1,2 @@ +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= diff --git a/service_b/internal/domains/meteo/service.go b/service_b/internal/domains/meteo/service.go index 53df9ec..3d1e92a 100644 --- a/service_b/internal/domains/meteo/service.go +++ b/service_b/internal/domains/meteo/service.go @@ -2,11 +2,14 @@ package meteo import ( "context" + "errors" "fmt" "log/slog" "net/http" "sync" "time" + + "github.com/cenkalti/backoff/v5" ) type inMemory struct { @@ -29,19 +32,31 @@ func (s *Service) GetWeatherByCity(ctx context.Context, params GetMeteoData) ([] } toDate := fromDate.AddDate(0, 0, params.Days-1) - url := fmt.Sprintf("http://localhost:8080/data?city=%s&from=%s&to=%s", - params.Location, params.Date, toDate.Format("2006-01-02")) + operation := func() (*http.Response, error) { + url := fmt.Sprintf("http://localhost:8080/data?city=%s&from=%s&to=%s", + params.Location, params.Date, toDate.Format("2006-01-02")) - resp, err := http.Get(url) - if err != nil { - return nil, err + resp, err := http.Get(url) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode == http.StatusBadRequest { + return nil, backoff.Permanent(errors.New("bad request")) + } + + return resp, nil } - defer resp.Body.Close() - // TODO add backoff + result, err := backoff.Retry(ctx, operation, backoff.WithBackOff(backoff.NewExponentialBackOff())) + if err != nil { + slog.Error("somethin happened") + return []MeteoData{}, err + } // TODO add ristretto - slog.Info("fetched data", "data", resp) + slog.Info("fetched data", "data", result) return []MeteoData{}, nil }