Last active
January 27, 2016 23:11
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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