Retry on 429/5xx responses across all HTTP clients
Previously retry: :transient only retried connection errors, not HTTP 429 rate limits. All clients now use a custom retry function that handles 429, 500, 502, 503, 504 with 5 retries and jittered backoff.
This commit is contained in:
parent
3534b282af
commit
9334539442
3 changed files with 30 additions and 6 deletions
|
|
@ -101,14 +101,22 @@ defmodule Microwaveprop.Terrain.ElevationClient do
|
||||||
defp deg_to_rad(deg), do: deg * :math.pi() / 180
|
defp deg_to_rad(deg), do: deg * :math.pi() / 180
|
||||||
|
|
||||||
defp req_options do
|
defp req_options do
|
||||||
defaults = [retry: :transient, max_retries: 2, retry_delay: &retry_delay/1]
|
defaults = [retry: &retry?/2, max_retries: 5, retry_delay: &retry_delay/1]
|
||||||
overrides = Application.get_env(:microwaveprop, :elevation_req_options, [])
|
overrides = Application.get_env(:microwaveprop, :elevation_req_options, [])
|
||||||
Keyword.merge(defaults, overrides)
|
Keyword.merge(defaults, overrides)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp retry?(_request, response) do
|
||||||
|
case response do
|
||||||
|
%Req.Response{status: status} when status in [429, 500, 502, 503, 504] -> true
|
||||||
|
%{__exception__: true} -> true
|
||||||
|
_ -> false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp retry_delay(n) do
|
defp retry_delay(n) do
|
||||||
base = Integer.pow(2, n) * 1_000
|
base = Integer.pow(2, n) * 1_000
|
||||||
jitter = :rand.uniform(500)
|
jitter = :rand.uniform(1_000)
|
||||||
base + jitter
|
base + jitter
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -242,14 +242,22 @@ defmodule Microwaveprop.Weather.HrrrClient do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp req_options do
|
defp req_options do
|
||||||
defaults = [retry: :transient, max_retries: 3, retry_delay: &retry_delay/1]
|
defaults = [retry: &retry?/2, max_retries: 5, retry_delay: &retry_delay/1]
|
||||||
overrides = Application.get_env(:microwaveprop, :hrrr_req_options, [])
|
overrides = Application.get_env(:microwaveprop, :hrrr_req_options, [])
|
||||||
Keyword.merge(defaults, overrides)
|
Keyword.merge(defaults, overrides)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp retry?(_request, response) do
|
||||||
|
case response do
|
||||||
|
%Req.Response{status: status} when status in [429, 500, 502, 503, 504] -> true
|
||||||
|
%{__exception__: true} -> true
|
||||||
|
_ -> false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp retry_delay(n) do
|
defp retry_delay(n) do
|
||||||
base = Integer.pow(2, n) * 1_000
|
base = Integer.pow(2, n) * 1_000
|
||||||
jitter = :rand.uniform(500)
|
jitter = :rand.uniform(1_000)
|
||||||
base + jitter
|
base + jitter
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -74,14 +74,22 @@ defmodule Microwaveprop.Weather.IemClient do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp req_options do
|
defp req_options do
|
||||||
defaults = [retry: :transient, max_retries: 3, retry_delay: &retry_delay/1]
|
defaults = [retry: &retry?/2, max_retries: 5, retry_delay: &retry_delay/1]
|
||||||
overrides = Application.get_env(:microwaveprop, :iem_req_options, [])
|
overrides = Application.get_env(:microwaveprop, :iem_req_options, [])
|
||||||
Keyword.merge(defaults, overrides)
|
Keyword.merge(defaults, overrides)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp retry?(_request, response) do
|
||||||
|
case response do
|
||||||
|
%Req.Response{status: status} when status in [429, 500, 502, 503, 504] -> true
|
||||||
|
%{__exception__: true} -> true
|
||||||
|
_ -> false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp retry_delay(n) do
|
defp retry_delay(n) do
|
||||||
base = Integer.pow(2, n) * 1_000
|
base = Integer.pow(2, n) * 1_000
|
||||||
jitter = :rand.uniform(500)
|
jitter = :rand.uniform(1_000)
|
||||||
base + jitter
|
base + jitter
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue