1
0
Fork 0
mirror of https://github.com/benbusby/farside.git synced 2025-04-30 07:30:02 +00:00

Prevent same instance from being selected twice in a row

Introduces a new db key "<service>-previous" to track which instance was
last selected for a particular service. This allows for filtering the
list of available instances to exclude the instance that was last
picked, to ensure a (slightly) more even distribution of traffic.
There's still the possiblity of the following scenario, however:

:service instances > 2

/:service request #1 -> instance #1
/:service request #2 -> instance #2
/:service request #3 -> instance #1
/:service request #4 -> instance #2

where there are many ignored instances for a particular service. One
possible solution would be to implement the "<service>-previous" value
to be a list, rather than a single value, and push to that list until
only one element is left in the original "instance" array after
filtering, and then delete the "<service>-previous" key.
This commit is contained in:
Ben Busby 2021-11-10 12:19:37 -07:00
parent 71fb89e028
commit 8ee4f308a4
No known key found for this signature in database
GPG key ID: 339B7B7EB5333D14
4 changed files with 45 additions and 8 deletions

View file

@ -42,15 +42,28 @@ defmodule FarsideTest do
IO.puts("")
Enum.map(service_names, fn service_name ->
IO.puts("/#{service_name}")
conn =
:get
|> conn("/#{service_name}", "")
|> Router.call(@opts)
first_redirect = elem(List.last(conn.resp_headers), 1)
IO.puts(" /#{service_name} (#1) -- #{first_redirect}")
assert conn.state == :set
assert conn.status == 302
conn =
:get
|> conn("/#{service_name}", "")
|> Router.call(@opts)
second_redirect = elem(List.last(conn.resp_headers), 1)
IO.puts(" /#{service_name} (#2) -- #{second_redirect}")
assert conn.state == :set
assert conn.status == 302
assert first_redirect != second_redirect
end)
end
end