C++負載均衡遠程調用學習之自定義內存池管理

目錄

?

1.內存管理_io_buf的結構分析

2.Lars_內存管理_io_buf內存塊的實現

3.buf總結

4.buf_pool連接池的單例模式設計和基本屬性

5.buf_pool的初始化構造內存池

6.buf_pool的申請內存和重置內存實現

7.課前回顧


?

1.內存管理_io_buf的結構分析

## 3) Lars系統總體架構

?????????對于一個部門的后臺,為增強靈活性,一個服務可以被抽象為命令字:`modid+cmdid`的組合,稱為**一個模塊**,而這個服務往往有多個服務節點,其所有服務節點的地址集合被稱為這個模塊下的**路由**,節點地址簡稱為節點

-?`modid`:標識業務的大類,如:“直播列表相關”

-?`cmdid`:標識具體服務內容,如:“批量獲取直播列表”

???????業務代碼利用modid,cmdid,就可以調用對應的遠程服務一個Lars系統包含一個DNSService,一個Report Service,以及部署于每個服務器的LoadBalance Agent,業務代碼通過API與ELB系統進行交互

**API**?:根據自身需要的`modid,cmdid`,向ELB系統獲取節點、匯報節點調用結果;提供`C++`、`Java`、`Python`接口

**LoadBalance Agent**:運行于每個服務器上,負責為此服務器上的業務提供節點獲取、節點狀態匯報、路由管理、負載調度等核心功能

**DNSService**?: 運行于一臺服務器上(也可以用LVS部署多實例防單點),負責`modid,cmdid`到節點路由的轉換

**Report Service**?: 運行于DNSService同機服務器上,負責收集各`modid,cmdid`下各節點調用狀況,可用于觀察、報警

`modid,cmdid`數據由`Mysql`管理,具體SQL腳本在`common/sql`路徑下
至于`modid,cmdid`的注冊、刪除可以利用Web端操作MySQL。



![1-Lars-總體架構設計](./pictures/1-Lars-%E6%80%BB%E4%BD%93%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1.png)

如圖,每個服務器(虛線)部署了一臺LoadBalance Agent,以及多個業務服務

1.?開發者在Web端注冊、刪除、修改`modid,cmdid`的路由信息,信息被寫入到MySQL數據庫;
2.?服務器上每個業務biz都把持著自己需要通信的遠程服務標識`modid+cmdid`,每個biz都向本機LoadBalance Agent獲取遠程節點,進而可以和遠程目標服務通信,此外業務模塊會匯報本次的節點調用結果給LoadBalance Agent;
3.?LoadBalance Agent負責路由管理、負載均衡等核心任務,并周期性向DNSService獲取最新的路由信息,周期性把各`modid,cmdid`的各節點一段時間內的調用結果傳給Report Service
4.?DNSService監控MySQL,周期性將最新路由信息加載出來;
5.?Report Service將各`modid,cmdid`的各節點一段時間內的調用結果寫回到MySQL,方便Web端查看、報警

2.Lars_內存管理_io_buf內存塊的實現

# 二、項目目錄構建

?????首先在一切開始之前,我們應該將最基本的項目架構創建出來。



1)創建Lars代碼總目錄

```bash
$cd ~/
$mkdir Lars
```





2) 創建一個模塊Lars_reactor

lars_reactor是一個網絡IO庫,是我們要實現的,我們就先以它作為第一個子項目進行構建。

```bash
$mkdir lars_reactor
```

然后在lars_reactor模塊下創建一系列文件,如下

```bash
.
├── example
│?? └── testlib
│???????├── hello_lars.cpp
│???????└── Makefile
├── include
│?? └── tcp_server.h
├── lib
├── Makefile
└── src
????└── tcp_server.cpp
```

3.buf總結

3)代碼編寫

> src/tcp_server.cpp

```cpp
#include <iostream>

void lars_hello()?
{
????std::cout <<"lars hello" <<std::endl;?
}
```

> src/tcp_server.h

```cpp
#pragma once

void lars_hello();

4.buf_pool連接池的單例模式設計和基本屬性

我們要生成一個lib庫文件liblreactor.a,來提供一些reactor模塊的API接口。

生成liblreactor.a的Makefile如下

> lars_reactor/Makefile

```makefile
TARGET=lib/liblreactor.a
CXX=g++
CFLAGS=-g -O2 -Wall -fPIC -Wno-deprecated

SRC=./src

INC=-I./include
OBJS = $(addsuffix .o, $(basename $(wildcard $(SRC)/*.cpp)))

$(TARGET): $(OBJS)
????????mkdir -p lib
????????ar cqs $@ $^

%.o: %.cpp
????????$(CXX) $(CFLAGS) -c -o $@ $< $(INC)

.PHONY: clean

clean:
????????-rm -f src/*.o $(TARGET)
```



4)編譯

```bash
$cd lars/lars_reactor/
$make
$g++ -g -O2 -Wall -fPIC -Wno-deprecated -c -o src/tcp_server.o src/tcp_server.cpp -I./include
mkdir -p lib
ar cqs lib/liblreactor.a src/tcp_server.o
```

我們會在lib下得到一個liblreactor.a庫文件。

5.buf_pool的初始化構造內存池

5)調用liblreactor.a接口

```bash
$cd lars/lars_reactor/
$mkdir example/testlib -p
$cd example/testlib/
```



> hello_lars.cpp

```cpp
#include "tcp_server.h"

int main() {

????lars_hello();

????return 0;
}
```

6.buf_pool的申請內存和重置內存實現

7.課前回顧

> Makefile

```makefile
CXX=g++
CFLAGS=-g -O2 -Wall -fPIC -Wno-deprecated?

INC=-I../../include
LIB=-L../../lib -llreactor?
OBJS = $(addsuffix .o, $(basename $(wildcard *.cc)))

all:
????????$(CXX) -o hello_lars $(CFLAGS)??hello_lars.cpp $(INC) $(LIB)

clean:
????????-rm -f *.o hello_lars
```



編譯

```bash
$ make
g++ -o hello_lars -g -O2 -Wall -fPIC -Wno-deprecated???hello_lars.cpp -I../../include -L../../lib -llreactor?
```



執行

```cpp
$ ./hello_lars?
lars hello
```



我們現在一個基本的項目目錄就構建好了,大致如下

```bash
Lars/
├── lars_reactor
│?? ├── example
│?? │?? └── testlib
│?? │???????├── hello_lars
│?? │???????├── hello_lars.cpp
│?? │???????└── Makefile
│?? ├── include
│?? │?? └── tcp_server.h
│?? ├── lib
│?? │?? └── liblreactor.a
│?? ├── Makefile
│?? └── src
│???????├── tcp_server.cpp
│???????└── tcp_server.o
└── README.md
```

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903595.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903595.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903595.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

流水線問題(算法設計)C++

目錄 一、需求分析 1.1 問題描述 1.2 數據需求 1.3 功能需求 1.4 開發環境 二、概要設計 2.1 抽象數據類型 ADT 的定義 2.2 系統的主要功能模塊 2.3 功能模塊聯系圖 三、詳細設計 3.1 數據結構設計 3.2 主要算法 四、系統運行及結果分析 1. 用戶界面 2. 程序運行…

從實列中學習linux shell4: shell 腳本中 $0 $1 $2 $3 >> 以及 awk 都是干啥的?

在 Linux Shell 腳本中&#xff0c;這些符號和工具的功能如下&#xff1a; 一、位置參數 $0 $1 $2 $3 符號功能說明示例$0腳本自身的文件名若執行 ./test.sh&#xff0c;則 $0 值為 ./test.sh$1第一個參數執行 ./test.sh apple 時&#xff0c;$1 值為 "apple"$2第二…

TM1668芯片學習心得三

一、鍵掃數據儲存地址如下所示&#xff0c;先發讀鍵命令后&#xff0c;開始讀取按鍵數據BYTE1-BYTE5字節&#xff0c;讀數據從低位開始輸出&#xff0c;其中B6和B7位為無效位&#xff0c;此時芯片輸出為0。芯片K和KS引腳對應的按鍵按下時&#xff0c;相對應的字節內的 BIT位為1…

MySQL 基本查詢(一)

文章目錄 Create(insert)指定列的單行插入和全列插入多行全列插入和指定列的多行插入如果主鍵存在&#xff0c;要插入替換存在的值replace 基本select全列查詢指定列查詢where子句where子句案例語文成績在 [80, 90] 分的同學及語文成績數學成績是 58 或者 59 或者 98 或者 99 分…

LeetCode路徑總和系列問題解析:I、II、III的解決方案與優化

文章目錄 引言一、路徑總和 I&#xff08;LeetCode 112&#xff09;問題描述方法思路Java代碼實現復雜度分析 二、路徑總和 II&#xff08;LeetCode 113&#xff09;問題描述方法思路Java代碼實現復雜度分析 三、路徑總和 III&#xff08;LeetCode 437&#xff09;問題描述方法…

NFC 碰一碰發視頻貼牌技術,音頻功能的開發實踐與技術解析

在數字化營銷與信息交互場景中&#xff0c;NFC 碰一碰技術憑借其便捷性和高效性&#xff0c;成為快速傳遞多媒體內容的新選擇。通過 NFC 實現視頻音頻的快速傳輸&#xff0c;不僅能提升用戶體驗&#xff0c;還能為各類場景帶來創新應用。本文將深入探討該功能開發過程中的關鍵技…

跨境電商生死劫:IP篩查三法則破解封號魔咒

一、血淚數據&#xff1a;90%封號案源于IP污染 跨境電商平臺風控系統持續升級&#xff0c;2023年亞馬遜全球封號案例中&#xff0c;67%涉及賬號關聯&#xff08;Marketplace Pulse數據&#xff09;&#xff0c;其中IP問題占比高達91%。更觸目驚心的是&#xff1a; 新號存活率&…

MIPS架構詳解:定義、應用與其他架構對比

一、MIPS架構的定義 MIPS&#xff08;Microprocessor without Interlocked Pipeline Stages&#xff09; 是一種經典的精簡指令集&#xff08;RISC&#xff09;處理器架構&#xff0c;由斯坦福大學John Hennessy團隊于1981年提出&#xff0c;強調高效流水線設計和硬件簡化。 核…

第十六屆藍橋杯 2025 C/C++組 脈沖強度之和

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 思路詳解&#xff1a; 代碼&#xff1a; 代碼詳解&#xff1a; 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; P12338 [藍橋杯 2025 省 B/Python B 第二場] 脈沖強度…

從Ping到iperf3:深度實戰無線網絡壓測與優化指南

以下是測試無線網絡穩定性的詳細步驟與工具指南&#xff0c;涵蓋信號質量、吞吐量、干擾排查等關鍵維度&#xff1a; 一、基礎信號質量測試 1. 信號強度與覆蓋測試 工具&#xff1a;手機APP&#xff08;WiFi Analyzer、NetSpot&#xff09;或筆記本&#xff08;Acrylic WiFi&a…

MySQL 連接池 (Pool) 常用方法詳解

MySQL 連接池 (Pool) 常用方法詳解 1. 創建連接池 首先需要創建連接池實例&#xff1a; const mysql require(mysql2/promise); // 使用Promise版本const pool mysql.createPool({host: localhost,user: root,password: password,database: test,waitForConnections: true…

大型連鎖酒店集團數據湖應用示例

目錄 一、應用前面臨的嚴峻背景 二、數據湖的精細化構建過程 &#xff08;一&#xff09;全域數據整合規劃 &#xff08;二&#xff09;高效的數據攝取與存儲架構搭建 &#xff08;三&#xff09;完善的元數據管理體系建設 &#xff08;四&#xff09;強大的數據分析平臺…

GNU gettext 快速上手

文章目錄 1.簡介2.核心概念國際化 (i18n)本地化 (l10n)POT 文件PO 文件MO 文件文本域翻譯函數 3.主要組件4.使用示例參考文獻 1.簡介 GNU gettext 是一套用于軟件國際化&#xff08;internationalization&#xff0c;i18n&#xff09;和本地化&#xff08;localization&#x…

分享:VTK版本的選擇 - WPF空域問題

在早期版本中&#xff0c;ActiViz 對 Windows Presentation Foundation (WPF) 框架的支持是通過 WindowsFormHost 組件實現的&#xff0c;這種方式依賴于 WindowsForm 和 WPF 的互操作性。然而&#xff0c;這種方法存在一個眾所周知的“空域問題”&#xff08;airspace issue&a…

python數據分析(六):Pandas 多數據操作全面指南

Pandas 多數據操作全面指南&#xff1a;Merge, Join, Concatenate 與 Compare 1. 引言 在數據分析工作中&#xff0c;我們經常需要處理多個數據集并將它們以各種方式組合起來。Pandas 提供了多種強大的多數據操作方法&#xff0c;包括合并(merge)、連接(join)、連接(concaten…

spring 面試題

一、Spring 基礎概念 什么是 Spring 框架&#xff1f; Spring 是一個開源的 Java 應用程序框架&#xff0c;它提供了一種輕量級的、非侵入式的方式來構建企業級應用。Spring 的核心功能包括依賴注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;、面向切面編程…

OpenCV-Python (官方)中文教程(部分一)_Day20

22.直方圖 22.1直方圖的計算,繪制與分析 使用 OpenCV 或 Numpy 函數計算直方圖 使用 Opencv 或者 Matplotlib 函數繪制直方圖 將要學習的函數有&#xff1a;cv2.calcHist(),np.histogram() 什么是直方圖呢&#xff1f;通過直方圖你可以對整幅圖像的灰度分布有一個整體的 了…

數電發票整理:免費實用工具如何高效解析 XML 發票數據

如今數字電子發票越來越普及&#xff0c;但是數電發票的整理還是頗有講究~ 今天給大家介紹一個 XML 發票閱讀器。使用它完全不收取任何費用&#xff0c;且無廣告干擾&#xff0c;對財務人員而言十分實用。 01 軟件介紹 這款軟件就是XML格式&#xff08;數電票&#xff09;閱讀…

深度學習正則化:原理、方法與應用深度解析

摘要 本文深入探討深度學習中的正則化技術&#xff0c;介紹其避免過擬合的重要性&#xff0c;詳細講解常見的正則化方法&#xff0c;如 L 1 L_1 L1?和 L 2 L_2 L2?正則化、Dropout等&#xff0c;并通過線性回歸案例和神經網絡訓練流程對其進行直觀闡釋。幫助讀者理解正則化原…

【爬蟲】deepseek談爬蟲工具

2025 年&#xff0c;隨著 Web 技術的演進和反爬機制的升級&#xff0c;工具生態也會進一步優化。以下是 2025 年爬蟲 & 自動化測試的前沿工具預測&#xff0c;結合行業趨勢和現有技術發展方向&#xff1a; &#x1f680; 2025 年推薦組合&#xff08;預測版&#xff09; 1…