python負荷等化の簡単な実現方法

2142 ワード

配布リクエストといえば、まず多くの人がNginxを思い浮かべると思います.Nginxは多機能サーバとして、ホストipを逆エージェントで隠す能力だけでなく、簡単なキャッシュ加速機能も提供しています.もちろん、Nginxの最も強力な機能は配布要求であり、ハッシュ、一貫性ハッシュ、負荷等化などの多種の要求配布モードを提供するだけでなく、自分のサービスの軽量と安定を保証している.1台のNginxサーバは、高い同時要求環境で長年にわたって稼働しており、ダウンタイムも極めて少ない.
Nginxロード・バランシング・モードでは、最小圧力のダウンタイム・サーバーにリクエストが送信されます.今日、ターゲットサーバの圧力を考慮せずに、pythonで最も簡単な負荷分散方法を実現し、ダウンタイムのないサーバに要求を送信します.
moduleを呼び出したいのですがbモジュールのインタフェース、module_bサービスは、10.10.10.115サーバ上の10081100821008310084の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 ...
') 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']

ConnectionErrorとModule_bExceptionはパッケージ化されたエラークラスなので気にする必要はありません.
負荷全体の等化の実現も簡単で、apiとパラメータを入力し、すべてのmodule_からbアドレスからランダムに1つを選択し、module_にアクセスできない場合は完全なrequestsリクエストに接続するbサービスは、別の未アクセスmoduleに変更されます.bすべてのmoduleにアクセスするまでサービスアドレスbサービス.
まとめ
以上、編集者が紹介したpython負荷バランスの簡単な実現方法です.