Apertium-apy/load balancing
Jump to navigation
Jump to search
OrderedDict( ( (ServerHost, ServerPort), #('http://localhost/', 2738) (AggregateServerScore, { #12.55266488 - Sum of values in following dict (weight them somehow - check numbers to see how) '/list.*': MovingAverageResponseTime (how many? - exponential moving average maybe?) '/analyze': MovingAverageResponseTime/ResponseLength, '/translate': MovingAverageResponseTime/ResponseLength, '/generate': MovingAverageResponseTime/ResponseLength } ) ... )
The plan for a "Fastest" paradigm load balancer (Random, RoundRobin, and LeastConnections exist; WeightedRandom in dev.)
- On gateway start, call each server's '/list's and initalize the server pool while checking for valid responses - drop any servers that don't respond properly
- For each request, inform the handler on request start and end
- If the request is on the list of acceptable benchmark URLs, update the cooresponding moving average and aggregate score, re-sort the serverpool on aggregate score
- Periodically, call each server's '/list's and drop all existing data (what intervals?)
- When the request handler asks for a server, return the handler which has the LOWEST aggregateServerScore - this will form a negative feedback loop
Future: integrate least connections and fastest load balancer... maybe even query servers to ask for their current load status (is their integrity a concern?)
Notes to self:
- Ignore requests that response is 4xx HTTP code
- If server returns a 5xx for a '/list' at anytime, float('inf') for that server (effectively remove it from pool), let it only reenter the server pool when periodic testing occurs
- Check if pool is ever empty, if so, raise critical error and return 503 for all requests