I'm looking into adding load balancing algorithms to traefik (like lowest response time, least utilized, etc.) as part of a research project. I want to do it in a way that the result could maybe find its way into the main tree at some point. I was hoping to get a couple of pointers on how to do it properly.
From my (albeit limited) understanding of the way HTTP load balancing is implemented in traefik, there are two layers: service and server load balancing. Service-level load balancing is implemented in traefik (e.g, the WRR or Mirror), wheres as on server-level traefik leverages the load balancing code (currently only round robin) of vulcand/oxy.
My first question is therefore: is the appropriate project for additional load balancing code on server level oxy or traefik? Our would both be fine? Is there a particular reason oxy was used for load balancing?
My second question: are there any existing proposals to extend the configuration to accommodate additional load balancing algorithms? I played around with the
http_config.go and found that there are several ways the
ServersLoadBalancer struct could be extended. For example, one could add an
Algorithm container to hold the load balancer configuration. For example:
[http] # ... [http.services] [http.services.myapp] [http.services.myapp.loadBalancer] [http.services.myapp.loadBalancer.algorithm.lowestResponseTime] aggregate = "10" epsilon = "10ms" [[http.services.myapp.loadBalancer.servers]] # ...
algorithm container could be extended with specific algorithm configurations, the default being
roundRobin that requires no configuration.
Hoping to get some feedback on this!