Skip to content

Instantly share code, notes, and snippets.

@Shaunwei
Last active January 27, 2016 23:11
Show Gist options
  • Save Shaunwei/41409e4424774bfcd8d7 to your computer and use it in GitHub Desktop.
Save Shaunwei/41409e4424774bfcd8d7 to your computer and use it in GitHub Desktop.
Example of how server and load balancer work. Balancing algorithm uses Round Robin algorithm.
from typing import Sequence
class Request:
def __init__(self, id):
self.id = str(id)
def __str__(self):
return '[Request: %s]' % self.id
class Response:
def __init__(self, id):
self.id = id
def __str__(self):
return '[Response: %s]' % self.id
class Server:
def __str__(self):
return '[Server: %s]' % self.name
def process(self, request: Request) -> Response:
raise NotImplementedError('process need to implement')
class ImageServer(Server):
def __init__(self, name: str):
self.name = name
def process(self, request: Request) -> Response:
return Response('image' + request.id)
class MsgServer(Server):
def __init__(self, name: str):
self.name = name
def process(self, request: Request) -> Response:
return Response('msg' + request.id)
class LoadBalancer:
def __init__(self, servers: Sequence[Server]=[]):
self.server_manager = []
self.request_counts = 0
def register(self, server: Server) -> None:
self.server_manager.append(server)
def unregister(self, server: Server) -> None:
for i, mserver in enumerate(self.server_manager):
if mserver is server:
break
self.server_manager.pop(i)
def log(self, request: Request, response: Response):
print(request, ' : ', response)
def dispatch(self, request: Request) -> Response:
'''
round robin algorithm
'''
self.request_counts += 1
n = len(self.server_manager)
server = self.server_manager[self.request_counts % n]
response = server.process(request)
self.log(request, response)
return response
if __name__ == '__main__':
servers = [ImageServer('a'), MsgServer('b')]
lb = LoadBalancer()
for s in servers:
lb.register(s)
for request in map(Request, range(10)):
lb.dispatch(request)
"""
[Request: 0] : [Response: msg0]
[Request: 1] : [Response: image1]
[Request: 2] : [Response: msg2]
[Request: 3] : [Response: image3]
[Request: 4] : [Response: msg4]
[Request: 5] : [Response: image5]
[Request: 6] : [Response: msg6]
[Request: 7] : [Response: image7]
[Request: 8] : [Response: msg8]
[Request: 9] : [Response: image9]
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment