summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Busby <noreply+git@benbusby.com>2021-11-10 11:50:19 -0700
committerBen Busby <noreply+git@benbusby.com>2021-11-10 11:50:19 -0700
commit71fb89e02889ec64db3659ddf13740ac2fe22407 (patch)
tree400456f625ff41b723f10b5f64a3609a75bd80bd
parentd334fc76950b54eb641627d016b28a4824cf2657 (diff)
downloadfarside-71fb89e02889ec64db3659ddf13740ac2fe22407.tar.gz
Move instance selection logic out of router
The process of selecting a random (working) instance for a specified service has been moved out of the router and into lib/farside.ex. Moving forward, the router itself should have very simple and easy to follow logic for all paths.
-rw-r--r--lib/farside.ex31
-rw-r--r--lib/farside/router.ex29
2 files changed, 32 insertions, 28 deletions
diff --git a/lib/farside.ex b/lib/farside.ex
index f87706a..0595e33 100644
--- a/lib/farside.ex
+++ b/lib/farside.ex
@@ -1,5 +1,6 @@
defmodule Farside do
@service_prefix Application.fetch_env!(:farside, :service_prefix)
+ @fallback_str Application.fetch_env!(:farside, :fallback_str)
def get_services_map do
{:ok, service_list} = Redix.command(:redix, ["KEYS", "#{@service_prefix}*"])
@@ -24,6 +25,36 @@ defmodule Farside do
end)
end
+ def pick_instance(service) do
+ {:ok, instances} =
+ Redix.command(
+ :redix,
+ [
+ "LRANGE",
+ "#{@service_prefix}#{service}",
+ "0",
+ "-1"
+ ]
+ )
+
+ # Either pick a random available instance,
+ # or fall back to the default one
+ instance =
+ if Enum.count(instances) > 0 do
+ Enum.random(instances)
+ else
+ {:ok, result} =
+ Redix.command(
+ :redix,
+ ["GET", "#{service}#{@fallback_str}"]
+ )
+
+ result
+ end
+
+ instance
+ end
+
def get_last_updated do
{:ok, last_updated} =
Redix.command(
diff --git a/lib/farside/router.ex b/lib/farside/router.ex
index 82b3757..7f31e04 100644
--- a/lib/farside/router.ex
+++ b/lib/farside/router.ex
@@ -1,7 +1,5 @@
defmodule Farside.Router do
@index Application.fetch_env!(:farside, :index)
- @fallback_str Application.fetch_env!(:farside, :fallback_str)
- @service_prefix Application.fetch_env!(:farside, :service_prefix)
use Plug.Router
@@ -27,32 +25,7 @@ defmodule Farside.Router do
get "/:service/*glob" do
path = Enum.join(glob, "/")
-
- {:ok, instances} =
- Redix.command(
- :redix,
- [
- "LRANGE",
- "#{@service_prefix}#{service}",
- "0",
- "-1"
- ]
- )
-
- # Either pick a random available instance,
- # or fall back to the default one
- instance =
- if Enum.count(instances) > 0 do
- Enum.random(instances)
- else
- {:ok, result} =
- Redix.command(
- :redix,
- ["GET", "#{service}#{@fallback_str}"]
- )
-
- result
- end
+ instance = Farside.pick_instance(service)
# Redirect to the available instance
conn