手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Python实现简单的负载均衡

[日期:2018-02-04] 来源:Linux社区  作者:baiyb [字体: ]

提到分发请求,相信大多数人首先会想到Nginx,Nginx作为一种多功能服务器,不仅提供了反向代理隐藏主机ip的能力,还拥有简单的缓存加速功能。当然Nginx最强大的功能还是分发请求,不仅提供了哈希,一致性哈希,负载均衡等多种请求分发模式,还保证了自己服务的轻量和稳定。一台Nginx服务器常年工作在高并发请求的环境下,也极少宕机。

在Nginx负载均衡模式下,请求会发送到压力最小的未宕机服务器上。今天我们不考虑目标服务器的压力,用Python实现最简单的负载均衡方法,即将请求发送到未宕机的服务器上。

我们想调用module_b模块中的接口,module_b服务在10.10.10.115服务器上的10081,10082,10083,10084这4个端口上。

#!/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服务。

本文永久更新链接地址http://www.linuxidc.com/Linux/2018-02/150746.htm

linux
相关资讯       Python实现负载均衡 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款