python實現簡單的負載均衡

提到分發請求,相信大多數人首先會想到Nginx,Nginx做爲一種多功能服務器,不只提供了反向代理隱藏主機ip的能力,還擁有簡單的緩存加速功能。固然Nginx最強大的功能仍是分發請求,不只提供了哈希,一致性哈希,負載均衡等多種請求分發模式,還保證了本身服務的輕量和穩定。一臺Nginx服務器常年工做在高併發請求的環境下,也極少宕機。python

在Nginx負載均衡模式下,請求會發送到壓力最小的未宕機服務器上。今天咱們不考慮目標服務器的壓力,用python實現最簡單的負載均衡方法,即將請求發送到未宕機的服務器上。json

咱們想調用module_b模塊中的接口,module_b服務在10.10.10.115服務器上的10081,10082,10083,10084這4個端口上。api

 

#!/usr/bin/python
# -*- coding: utf-8 -*-

import requests
import random
import os
import sys
import time
import ConnectionError
import Module_bException

module_b = "10.10.10.115:10081,10.10.10.115:10082,10.10.10.115:10083,10.10.10.115:10084"

class Module_b():

    def __init__(self):
        self.url_prefix = [val.strip() for val in module_b.split(',')]

    def _request(self, short_uri, payload):
        res = None
        try_count = 1
        url_prefixs = self.url_prefix[:]
        url_prefixs.sort(key=lambda f: random.randint(0, 100))
      
for curr_url_prefix in url_prefixs: url = os.path.join(curr_url_prefix, short_uri) try: res = requests.post(url, data=payload) break except ConnectionError as e: try_count += 1 sys.stderr.write('can not connect to Module_b, retry ...\n') time.sleep(1) if try_count == len(url_prefixs): raise e if res.status_code != 200: raise Module_bException('HTTP ERROR: %s' % res.text) result = res.json() if result['status'] != '0': raise Module_bException(result['errstr']) return result['result']

ConnecttionError和Module_bException爲封裝好的報錯類無需在乎。緩存

整個負載均衡的實現也很簡單,傳入api和參數,而後從全部的module_b地址中隨機選出一個,拼接成完整的requests請求,若是沒法訪問到module_b服務,那麼將換到另外一個未訪問過的module_b服務地址,直到訪問過所有的module_b服務。服務器

相關文章
相關標籤/搜索