1
0
Fork 0
mirror of https://github.com/benbusby/farside.git synced 2025-05-03 17:10:03 +00:00

Output available instances and fallback URL to redis

Once a list of available URLs has been determined for a particular
service, the list is written as "service -> [list of instances]" to a
local redis connection. These can then be used in the greater routing
logic to pick a random instance from the list, or use a fallback
instance if none are determined to be available.
This commit is contained in:
Ben Busby 2021-10-22 17:15:40 -06:00
parent b0953f0777
commit 4949ae22bb
No known key found for this signature in database
GPG key ID: 339B7B7EB5333D14
5 changed files with 70 additions and 29 deletions

View file

@ -1,8 +1,9 @@
defmodule Instance do
defmodule Service do
defstruct [
instance_type: nil,
instance_test: nil,
instance_list: []
type: nil,
test_url: nil,
fallback: nil,
instances: []
]
end
@ -18,16 +19,52 @@ defmodule Instances do
end
def update(filename) do
{:ok, conn} = Redix.start_link(
"redis://localhost:6379",
name: :redix
)
{:ok, file} = File.read(filename)
{:ok, json} = Poison.decode(file, as: [%Instance{}])
{:ok, json} = Poison.decode(file, as: [%Service{}])
# Loop through all instances and check each for availability
for service <- json do
result = Enum.filter(service.instance_list, fn(url) ->
request(url <> service.instance_test) == :good
result = Enum.filter(service.instances, fn(instance_url) ->
request(instance_url <> service.test_url) == :good
end)
# TODO: Output result to redis
IO.inspect(result)
add_to_redis(conn, service, result)
end
end
def add_to_redis(conn, service, instances) do
# Remove previous list of instances
Redix.command(conn, [
"DEL",
service.type
])
# Update with new list of available instances
Redix.command(conn, [
"LPUSH",
service.type
] ++ instances)
# Set fallback to one of the available instances,
# or the default instance if all are "down"
if Enum.count(instances) > 0 do
Redix.command(conn, [
"SET",
service.type <> "-fallback",
Enum.random(instances)
])
else
Redix.command(conn, [
"SET",
service.type <> "-fallback",
service.fallback
])
end
end
end
Instances.update("instances.json")
Instances.update("services.json")