<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 三、Lars-DNS Service開發 ## **1) 簡介** 負責接收各agent對某modid、cmdid的請求并返回該modid、cmdid下的所有節點,即為agent提供獲取路由服務 ### 1.1 架構 ![](https://img.kancloud.cn/ae/40/ae40825410fb56d82c2ade175f428f41_1112x744.png) ### **1.2 網絡模塊** ? DnsService服務模型采用了one loop per thread TCP服務器,主要是基于Lars-Reactor: - 主線程Accepter負責接收連接(agent端連接) - Thread loop們負責處理連接的請求、回復;(agent端發送查詢請求,期望獲取結果) ### **1.3 雙map模型** ? DnsServer使用兩個map存儲路由數據(key = `modid<<32 + cmdid` , value = set of `ip<<32 + port`) - 一個`RouterDataMap_A`:主數據,查詢請求在此map執行 - 另一個`RouterDataMap_B`:后臺線程周期性重加載路由到此map,作為最新數據替換掉上一個map 這兩個map分別由指針`data_pointer`與`temp_pointer`指向. ### 1.4 Backend Thread守護線程 **dns service還有個業務線程:** 1、負責周期性(default:1s)檢查`RouteVersion`表版本號,如有變化,說明`RouteData`有變更,則重加載`RouteData`表內容;然后將`RouteChange`表中被變更的`modid`取出,根據訂閱列表查出`modid`被哪些連接訂閱后,向所有工作線程發送任務:要求訂閱這些`modid`的連接推送`modid`路由到agent 2、此外,還負責周期性(default:8s)重加載`RouteData`表內容 **PS:重加載`RouteData`表內容的細節** 重加載`RouteData`表內容到`temp_pointer`指向的`RouterDataMap_B`,而后上寫鎖,交換指針`data_pointer`與`temp_pointer`的地址,于是完成了路由數據更新 ### **主業務** 1. 服務啟動時,`RouteData`表被加載到`data_pointer`指向的`RouterDataMap_A`中, `temp_pointer`指向的`RouterDataMap_B`為空 2. 服務啟動后,agent發來Query for 請求某`modid/cmdid`,到其所在Thread Loop上,上讀鎖查詢`data_pointer`指向的`RouterDataMap_A`,返回查詢結果; 3. 如果此`modid/cmdid`不存在,則把`agent ip+port`+`moid/cmdid`發送到Backend thread loop1的隊列,讓其記錄到ClientMap 后臺線程Backend thread每隔10s清空`temp_pointer`指向的`RouterDataMap_B`,再加載`RouteData`表內容到`temp_pointer`指向的`RouterDataMap_B`,加載成功后交換指針`data_pointer`與`temp_pointer`指針內容,于是完成了路由數據的更新. --- ### 關于作者: 作者:`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>

                              哎呀哎呀视频在线观看