為保證程式的穩定性和質量,記憶體要求使用智慧型指標(c++11),同時使用了boost(智慧型指標使用c++11)。
1 自定義標準標頭檔案se_std.h
#ifndef h_cf4bc297_2737_4b2e_ab51_c0915f823960
#define h_cf4bc297_2737_4b2e_ab51_c0915f823960
#include
#include
#include
/*檢查指標引數是否有效*/
#define check_ptrparam_isnull(x)\
do while (0)
/*檢查智慧型指標是否成功,失敗丟擲異常*/
#define check_smart_ptr(x)\
do while (0)
/*檢查分配記憶體是否成功,失敗丟擲異常*/
#define check_malloc_isfail(x)\
do while (0)
/*檢查並釋放記憶體*/
#define check_free(x)\
do \
} while (0)
/*這個巨集僅用於**摺疊*/
#define se_collapse
/*自定義資料型別,使之在各個平台上都能符合要求*/
#define byte unsigned char
#define int2 short
#define uint2 unsigned short
#define int4 int
#define uint4 unsigned int
#define float4 float
#define float8 double
#if defined(_msc_ver )
#define int8 __int64
#define uint8 unsigned __int64 int8
#else
#define int8 long long int
#define uint8 unsigned long long int
#endif
/** 自定義異常類和異常型別
*/struct se_exception : virtual std::exception, virtual boost::exception {};
typedef boost::error_infose_error_message;
/** 丟擲異常(異常訊息、檔名、行號、丟擲異常的函式)
* 獲取異常訊息: std::string err_msg = *boost::get_error_info(exp);
* 獲取檔名: std::string file_name = *boost::get_error_info(exp);
* 獲取行號: int at_line = *boost::get_error_info(exp);
* 獲取丟擲異常的函式: std::string str_api_function = *boost::get_error_info(exp);
*/#define se_throw(msg) throw se_exception()<#endif /* h_cf4bc297_2737_4b2e_ab51_c0915f823960 */
2 平滑加權輪詢演算法se_balancing.hpp
#ifndef h_dc4c657c_63bf_450f_8ad5_42adcbff69a8
#define h_dc4c657c_63bf_450f_8ad5_42adcbff69a8
#include
#include
#include
#include "se_std.h"
using namespace std;
/*伺服器權重係數配置類*/
class se_server
se_server(const se_server &server) :
m_weight(server.weight()), m_oldweight(server.oldweight()), m_curweight(server.curweight()) {}
virtual ~se_server() {}
public:
inline const int4 &weight() const
inline void weight(const int4 &weight)
inline const int4 &curweight() const
inline void curweight(const int4 &curweight)
inline const int4 &oldweight() const
/*獲取當前伺服器是否健康*/
inline bool health() const
};/*實現平滑加權輪詢(smooth weighted round-robin balancing)演算法類*/
class se_balancer : public boost::noncopyable
virtual ~se_balancer() {}
public:
/*平滑加權輪詢(smooth weighted round-robin balancing)演算法*/
inline int4 get_next_server_index(vector&ss) const
}se_server &server = ss.at(index);
server.curweight(server.curweight() - total);
return index;}/*
* 健康檢查執行緒每過10分鐘檢查一次不健康的伺服器
* 如不健康的伺服器可用時,恢復伺服器為可用狀態
*/inline void health(const int4 &index, vector&ss) const
/** 不再使用不健康的資料庫
* 在服務中獲取資料庫鏈結後,檢查連線狀態為關閉時,該資料庫將標記為不再使用
* 然後再次通過get_next_server_index獲取可使用的資料庫
* 如不健康的資料庫恢復,資料庫健康檢查執行緒在過一段時間後恢復可用
*/inline void unhealthy(const int4 &index, vector&ss) const
};#endif /* h_168e7c16_7638_4ee4_93f6_ee982858139d */
3 模擬測試
#include
#include
#include
#include "se_std.h"
#include "se_balancing.hpp"
using namespace std;/**
*/int main(int argc, char** ar**)
/*模擬100次請求分布到各個伺服器的情況*/
for (int4 i(1); i <= 100; ++i)
cout << "第" << i << "次請求:" << balancer.get_next_server_index(ss) << endl;
return 0;
} catch (se_exception &exp)
}
負載均衡,隨機加權重演算法實現
例如輸入資料 a 3 b 3 c 9 d 1 權重分別為3,3,9,1 具體演算法是將3,3,9,1 對映到一維座標中,0 3 6 15 16,取得乙個隨機數,範圍是0,16,看結果落在哪個區間就返回哪個數值 已下以python 為例子 import random import collection...
負載均衡演算法
輪循演算法 roundrobin 說明 每一次來自網路的請求輪流分配給內部中的每台伺服器,從1至n然後重新開始 舉例 適合於伺服器組中的所有伺服器都有相同的軟硬體配置並且平均服務請求相對均衡的情況 最少連線演算法 leastconnection 說明 客戶端的每一次請求服務在伺服器停留的時間都可能會...
負載均衡演算法
網際網路分布式系統中,很多服務是資料儲存相關的,海量訪問量下,直接訪問儲存介質是抗不住的,需要使用cache,cache集群的負載均衡演算法就成為乙個重要的話題,這裡對現有的負載均衡演算法進行一些總結。btw 雖然是cache負載均衡演算法小結,其實可以說是負載均衡演算法小結,只是針對cache應用...