From 22e9135e0ce6d67fdfc3308171c3db321bf154f8 Mon Sep 17 00:00:00 2001 From: Ben Busby Date: Fri, 18 Mar 2022 13:51:37 -0600 Subject: Reuse previous instance within rate-limit interval Rather than blocking <1s back-to-back queries from the same IP, Farside will now re-use the previously selected instance. Fixes #20 --- lib/farside.ex | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'lib/farside.ex') diff --git a/lib/farside.ex b/lib/farside.ex index ea574fa..16dc074 100644 --- a/lib/farside.ex +++ b/lib/farside.ex @@ -26,6 +26,15 @@ defmodule Farside do end) end + def last_instance(service) do + {:ok, previous} = + Redix.command( + :redix, + ["GET", "#{service}#{@previous_suffix}"] + ) + previous + end + def pick_instance(service) do {:ok, instances} = Redix.command( @@ -38,7 +47,7 @@ defmodule Farside do ] ) - # Either pick a random available instance, + # Either pick a random available instance, # or fall back to the default one instance = if Enum.count(instances) > 0 do @@ -48,14 +57,8 @@ defmodule Farside do else # ...otherwise pick a random one from the list, ensuring # that the same instance is never picked twice in a row. - {:ok, previous} = - Redix.command( - :redix, - ["GET", "#{service}#{@previous_suffix}"] - ) - instance = - Enum.filter(instances, &(&1 != previous)) + Enum.filter(instances, &(&1 != last_instance(service))) |> Enum.random() Redix.command( -- cgit v1.2.3