TASK
Implementation
Implement round robin load balancing:
- Maintain an ordered list of backend servers
- Track current server index
- For each request, send to server at current index
- Increment index (wrapping to 0 at end)
Round robin distributes load evenly when requests have similar cost.
Sample Test Cases
Even distributionTimeout: 5000ms
Input
{"src":"c0","dest":"lb","body":{"type":"init","msg_id":1,"node_id":"lb","node_ids":["lb","s1","s2","s3"]}}
{"src":"c1","dest":"lb","body":{"type":"add_servers","msg_id":2,"servers":["s1","s2","s3"]}}
{"src":"c2","dest":"lb","body":{"type":"get_server","msg_id":3}}
{"src":"c3","dest":"lb","body":{"type":"get_server","msg_id":4}}
{"src":"c4","dest":"lb","body":{"type":"get_server","msg_id":5}}
Expected Output
{"src": "lb", "dest": "c0", "body": {"type": "init_ok", "in_reply_to": 1, "msg_id": 0}}
{"src": "lb", "dest": "c1", "body": {"type": "add_servers_ok", "servers": ["s1", "s2", "s3"], "in_reply_to": 2, "msg_id": 1}}
{"src": "lb", "dest": "c2", "body": {"type": "get_server_ok", "server": "s1", "in_reply_to": 3, "msg_id": 2}}
{"src": "lb", "dest": "c3", "body": {"type": "get_server_ok", "server": "s2", "in_reply_to": 4, "msg_id": 3}}
{"src": "lb", "dest": "c4", "body": {"type": "get_server_ok", "server": "s3", "in_reply_to": 5, "msg_id": 4}}
Wrap aroundTimeout: 5000ms
Input
{"src":"c0","dest":"lb","body":{"type":"init","msg_id":1,"node_id":"lb","node_ids":["lb","s1","s2"]}}
{"src":"c1","dest":"lb","body":{"type":"add_servers","msg_id":2,"servers":["s1","s2"]}}
{"src":"c2","dest":"lb","body":{"type":"get_server","msg_id":3}}
{"src":"c3","dest":"lb","body":{"type":"get_server","msg_id":4}}
{"src":"c4","dest":"lb","body":{"type":"get_server","msg_id":5}}
Expected Output
{"src": "lb", "dest": "c0", "body": {"type": "init_ok", "in_reply_to": 1, "msg_id": 0}}
{"src": "lb", "dest": "c1", "body": {"type": "add_servers_ok", "servers": ["s1", "s2"], "in_reply_to": 2, "msg_id": 1}}
{"src": "lb", "dest": "c2", "body": {"type": "get_server_ok", "server": "s1", "in_reply_to": 3, "msg_id": 2}}
{"src": "lb", "dest": "c3", "body": {"type": "get_server_ok", "server": "s2", "in_reply_to": 4, "msg_id": 3}}
{"src": "lb", "dest": "c4", "body": {"type": "get_server_ok", "server": "s1", "in_reply_to": 5, "msg_id": 4}}
Hints
Hint 1▾
Track current position in server list
Hint 2▾
Increment and wrap on each request
Hint 3▾
Handle empty server list
OVERVIEW
Theoretical Hub
Round Robin
Round robin is the simplest load balancing algorithm. Requests cycle through servers in order: 1, 2, 3, 1, 2, 3... It works well when servers are identical and requests have similar processing cost.
Weighted Round Robin
When servers have different capacities, weighted round robin sends proportionally more requests to stronger servers. A server with weight 3 gets three turns for every one turn of a weight-1 server.
Key Concepts
round robinload balancingstateless
main.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python3
import sys
import json
import threading
class RoundRobinLB:
def __init__(self, servers):
self.servers = servers
self.current = 0
self.lock = threading.Lock()
def next_server(self):
# TODO: Return next server in rotation
pass
def add_server(self, server):
# TODO: Add server to pool
pass
def remove_server(self, server):
# TODO: Remove server from pool
pass
def handle_request(self, request):
server = self.next_server()
return server.handle(request)
if __name__ == "__main__":
pass