<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 9) 定期拉取最新路由信息(V0.6) 1. 當agent首次連接到dns service時,將全部的`load_balance`均設置為`NEW`狀態。如果dns service重新啟動,或者斷開鏈接重連,都會將之前的拉去中或者沒拉取的`load_balance`狀態都設置為`NEW`狀態,只有`NEW`狀態的`load_balance`才能定期自動拉取. > lars_loadbalance_agent/src/dns_client.cpp ``` //======================================================== static void conn_init(net_connection *conn, void *args) { for (int i = 0; i < 3; i++) { r_lb[i]->reset_lb_status(); } } //======================================================== void *dns_client_thread(void* args) { printf("dns client thread start\n"); event_loop loop; //1 加載配置文件得到dns service ip + port std::string ip = config_file::instance()->GetString("dnsserver", "ip", ""); short port = config_file::instance()->GetNumber("dnsserver", "port", 0); //2 創建客戶端 tcp_client client(&loop, ip.c_str(), port, "dns client"); //3 將thread_queue消息回調事件,綁定到loop中 dns_queue->set_loop(&loop); dns_queue->set_callback(new_dns_request, &client); //4 設置當收到dns service回執的消息ID_GetRouteResponse處理函數 client.add_msg_router(lars::ID_GetRouteResponse, deal_recv_route); //======================================================== //5.設置鏈接成功/鏈接斷開重連成功之后,通過conn_init來清理之前的任務 client.set_conn_start(conn_init); //======================================================== //啟動事件監聽 loop.event_process(); return NULL; } ``` > lars_loadbalance_agent/src/route_lb.cpp ```c //將全部的load_balance都重置為NEW狀態 void route_lb::reset_lb_status() { pthread_mutex_lock(&_mutex); for (route_map_it it = _route_lb_map.begin(); it != _route_lb_map.end(); it++) { load_balance *lb = it->second; if (lb->status == load_balance::PULLING) { lb->status = load_balance::NEW; } } pthread_mutex_unlock(&_mutex); } ``` 2. 增加配置文件參數update_timeout, 表示一個NEW狀態的load_balance下的modid/cmdid節點應該經歷多長時間進行一次刷新拉取。 > lars_loadbalance_agent/conf/lars_lb_agent.conf ```ini ;對于每個NEW狀態的modid/cmdid,多久更新一下本地路由,秒 update_timeout=15 ``` > lars_loadbalance_agent/include/main_server.h ```c struct load_balance_config { //... //對于每個NEW狀態的modid/cmdid,多久更新一下本地路由,秒 long update_timeout; }; ``` > lars_loadbalance_agent/src/main_server.cpp ```c static void init_lb_agent() { //1. 加載配置文件 config_file::setPath("./conf/lars_lb_agent.conf"); //... //... lb_config.update_timeout = config_file::instance()->GetNumber("loadbalance", "update_timeout", 15); //... } ``` 3. 給`load_balance`設置最后update時間參數,及最后一次從dns service拉取下來更新`host_map`的時間.然后在`route_lb`每次執行`get_host`的時候,對每個已經存在的host節點做最后時間超時檢查,如果超時,則重新從 dns service中拉取。 > lars_loadbalance_agent/include/load_balance.h ```c /* * 負載均衡算法核心模塊 * 針對一組(modid/cmdid)下的全部host節點的負載規則 */ class load_balance { public: load_balance(int modid, int cmdid): status(PULLING), last_update_time(0), _modid(modid), _cmdid(cmdid) { //load_balance 初始化構造 } // ... long last_update_time; //最后更新host_map時間戳 private: // ... }; ``` > lars_loadbalance_agent/src/load_balance.cpp ```c //根據dns service遠程返回的結果,更新_host_map void load_balance::update(lars::GetRouteResponse &rsp) { long current_time = time(NULL); //... //... //更新最后update時間 last_update_time = current_time; //重置狀態為NEW status = NEW; } ``` ? `load_balance`每次調用`update()`都記錄一次最后的更新時間,并標記為`NEW`表示當前`modid/cmdid`沒有在PULLING,可以再更新。 > lars_loadbalance_agent/src/route_lb.cpp ```c //agent獲取一個host主機,將返回的主機結果存放在rsp中 int route_lb::get_host(int modid, int cmdid, lars::GetHostResponse &rsp) { int ret = lars::RET_SUCC; //1. 得到key uint64_t key = ((uint64_t)modid << 32) + cmdid; pthread_mutex_lock(&_mutex); //2. 當前key已經存在_route_lb_map中 if (_route_lb_map.find(key) != _route_lb_map.end()) { //2.1 取出對應的load_balance load_balance *lb = _route_lb_map[key]; if (lb->empty() == true) { //存在lb 里面的host為空,說明正在pull()中,還沒有從dns_service返回來,所以直接回復不存在 assert(lb->status == load_balance::PULLING); rsp.set_retcode(lars::RET_NOEXIST); } else { ret = lb->choice_one_host(rsp); rsp.set_retcode(ret); // ================================================= //超時重拉路由 //檢查是否要重新拉路由信息 //若路由并沒有處于PULLING狀態,且有效期已經超時,則重新拉取 if (lb->status == load_balance::NEW && time(NULL) - lb->last_update_time > lb_config.update_timeout) { lb->pull(); } // ================================================= } } //3. ... // ... pthread_mutex_unlock(&_mutex); return ret; } ``` --- ### 關于作者: 作者:`Aceld(劉丹冰)` mail: [danbing.at@gmail.com](mailto:danbing.at@gmail.com) github: [https://github.com/aceld](https://github.com/aceld) 原創書籍: [http://www.hmoore.net/@aceld](http://www.hmoore.net/@aceld) ![](https://img.kancloud.cn/b0/d1/b0d11a21ba62e96aef1c11d5bfff2cf8_227x227.jpg) >**原創聲明:未經作者允許請勿轉載, 如果轉載請注明出處**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看