項目模塊劃分

項目模塊劃分

服務端模塊:

持久化數據管理中心模塊

在數據管理模塊中管理交換機,隊列,隊列綁定,消息等部分數據數據。

\1. 交換機管理:

a. 管理信息:名稱,類型,是否持久化標志,是否(無人使用時)自動刪除標志,其他參數,…

b. 管理操作:恢復歷史信息,聲明,刪除,獲取,判斷是否存在

\2. 隊列管理:

a. 管理信息:名稱,是否持久化標志,是否獨有標志,是否(無人使用時)自動刪除標志,其他參數,…

b. 管理操作:恢復歷史信息,聲明,刪除,獲取,判斷是否存在

\3. 綁定管理:

a. 管理信息:交換機名稱,隊列名稱,綁定主題

b. 管理操作:恢復歷史信息,綁定,解綁,解除交換機關聯綁定信息,解除隊列關聯綁定信息,獲取交換機關聯綁定信息

\4. 消息管理:

a. 管理信息

i. 屬性:消息 ID, 路由主題,持久化模式標志

ii. 消息內容

iii. 有效標志(持久化需要)

iv. 持久化位置(內存中)

v. 持久化消息長度(內存中)

b. 管理操作:恢復歷史信息,向指定隊列新增消息,獲取指定隊列隊首消息,確認移除消息

這幾個核心概念數據都需要在內存和硬盤中存儲的。

? 以內存存儲為主,主要是保證快速查找信息進行處理

? 以硬盤存儲為輔,主要是保證服務器重啟之后,之前的信息都可以正常保持

虛擬機管理模塊

因為交換機/隊列/綁定都是基于虛擬機為單元整體進行操作的,因此虛擬機是對以上數據管理模塊的整合模塊。

\1. 虛擬機管理信息:

a. 交換機數據管理模塊句柄

b. 隊列數據管理模塊句柄

c. 綁定數據管理模塊句柄

d. 消息數據管理模塊句柄

\2. 虛擬機對外操作:

a. 提供虛擬機內交換機聲明,交換機刪除操作。

b. 提供虛擬機內隊列聲明,隊列刪除操作。

c. 提供虛擬機內交換機-隊列綁定,解除綁定操作。

d. 獲取交換機相關綁定信息

\3. 虛擬機管理操作:

a. 創建虛擬機

b. 查詢虛擬機

c. 刪除虛擬機

交換路由模塊

當客戶端發布一條消息到交換機后,這條消息,應該被入隊到該交換機綁定的哪些隊列中?交換路由模塊就是決定這件事情的。

在綁定信息中有一個 binding_key,而每條發布的消息中有一個 routing_key,能否入隊取決于兩個要素:交換機類型和 key

\1. 廣播:將消息入隊到該交換機的所有綁定隊列中

\2. 直接:將消息入隊到綁定信息中 binding_key 與消息 routing_key 一致的隊列中

\3. 主題:將消息入隊到綁定信息中 binding_key 與 routing_key 是匹配成功的隊列中

binding_key

是由數字字母下劃線構成的, 并且使用 . 分成若干部分。

例如:news.music.#,這用于表示交換機綁定的當前隊列是一個用于發布音樂新聞的隊列。

? 支持 * 和 # 兩種通配符, 但是 * # 只能作為 . 切分出來的獨立部分, 不能和其他數字字母混用,

○ 比如 a.*.b 是合法的, a.*a.b 是不合法的

○ * 可以匹配任意一個單詞(注意是單詞不是字母)

○ # 可以匹配任意零個或者多個單詞(注意是單詞不是字母)

routing_key

是由數據、字母和下劃線構成, 并且可以使用 . 劃分成若干部分。

例如:news.music.pop,這用于表示當前發布的消息是一個流行音樂的新聞.

消費者管理模塊

消費者管理是以隊列為單元的,因為每個消費者都會在開始的時候訂閱一個隊列的消

息,當隊列中有消息后,會將隊列消息輪詢推送給訂閱了該隊列的消費者。

因此操作流程通常是,從隊列關聯的消息管理中取出消息,從隊列關聯的消費者中取

出一個消費者,然后將消息推送給消費者(這就是發布訂閱中負載均衡的用法)。

\1. 消費者信息:

a. 標識

b. 訂閱隊列名稱

c. 自動應答標志(決定了一條消息推送給消費者后,是否需要等待收到確認后

再刪除消息)

d. 消息處理回調函數指針(一個消息發布后調用回調,選擇消費者進行推送…)

i. void(const std::string& tag, const BasicProperties& p,

const std::string& body)

\2. 消費者管理:添加,刪除,輪詢獲取指定隊列的消費者,移除隊列所有消費者等

操作

信道管理模塊

本質上,在 AMQP 模型中,除了通信連接 Connection 概念外,還有一個 Channel 的

概念,Channel 是針對 Connection 連接的一個更細粒度的通信信道,多個 Channel 可

以使用同一個通信連接 Connection 進行通信,但是同一個 Connection 的 Channel 之

間相互獨立。

而信道模塊就是再次將上述模塊進行整合提供服務的模塊

\1. 管理信息:

a. 信道 ID

b. 信道關聯的消費者

c. 信道關聯的連接d. 信道關聯的虛擬機

e. 工作線程池(一條消息被發布到隊列后,需要將消息推送給訂閱了對應隊列

的消費者,過程由線程池完成)

\2. 管理操作:

a. 提供聲明&刪除交換機操作(刪除交換機的同時刪除交換機關聯的綁定信息)

b. 提供聲明&刪除隊列操作(刪除隊列的同時,刪除隊列關聯的綁定信息,消息,

消費者信息)

c. 提供綁定&解綁隊列操作

d. 提供訂閱&取消訂閱隊列消息操作

e. 提供發布&確認消息操作

連接管理模塊

本質上,咱們仿照實現的服務器是通過 muduo 庫來實現底層通信的,而這里的連接管理,更多的是對 muduo 庫中的 Connection 進行二次封裝管理,并額外提供項目所需操作。

\1. 管理信息:

a. 連接關聯的信道

b. 連接關聯的 muduo 庫 Connection

\2. 管理操作:新增連接,刪除連接,獲取連接,打開信道,關閉信道。

Broker 服務器模塊

整合以上所有模塊,并搭建網絡通信服務器,實現與客戶端網絡通信,能夠識別客戶端請求,并提供客戶端請求的處理服務。

管理信息:

a. 虛擬機管理模塊句柄

b. 消費者管理模塊句柄

c. 連接管理模塊句柄

d. 工作線程池句柄

e. muduo 庫通信所需元素…

客戶端模塊:

消費者管理

消費者在客戶端的存在感比較低,因為在用戶的使用角度中,只要創建一個信道后,

就可以通過信道完成所有的操作,因此對于消費者的感官更多是在訂閱的時候傳入了

一個消費者標識,且當前的簡單實現也僅僅是一個信道只能創建訂閱一個隊列,也就

是只能創建一個消費者,它們一一對應,因此更是弱化了消費者的存在。

\1. 消費者信息:

a. 標識

b. 訂閱隊列名稱

c. 自動應答標志(決定了一條消息推送給消費者后,是否需要等待收到確認后

再刪除消息)

d. 消息處理回調函數指針(一個消息發布后調用回調,選擇消費者進行推送…)

\2. 消費者管理:添加,刪除,輪詢獲取指定隊列的消費者,移除隊列所有消費者等

操作

信道請求模塊

與服務端的信道類似,客戶端這邊在 AMQP 模型中,也是除了通信連接 Connection

概念外,還有一個 Channel 的概念,Channel 是針對 Connection 連接的一個更細粒度

的通信信道,多個 Channel 可以使用同一個通信連接 Connection 進行通信,但是同一

個 Connection 的 Channel 之間相互獨立。

\1. 信道管理信息:

a. 信道 ID

b. 信道關聯的通信連接

c. 信道關聯的消費者

d. 請求對應的響應信息隊列(這里隊列使用 hash 表,以便于查找指定的響應)

e. 互斥鎖&條件變量(大部分的請求都是阻塞操作,發送請求后需要等到響應才

能繼續,但是 muduo 庫的通信是異步的,因此需要我們自己在收到響應后,通過

判斷是否是等待的指定響應來進行同步)

\2. 信道管理操作:

a. 提供創建信道操作

b. 提供刪除信道操作

c. 提供聲明交換機操作(強斷言-有則 OK,沒有則創建)

d. 提供刪除交換機e. 提供創建隊列操作(強斷言-有則 OK,沒有則創建)

f. 提供刪除隊列操作

g. 提供交換機-隊列綁定操作

h. 提供交換機-隊列解除綁定操作

i. 提供添加訂閱操作

j. 提供取消訂閱操作

k. 提供發布消息操作

通信連接模塊

向用戶提供一個用于實現網絡通信的 Connection 對象,從其內部可創建出粒度更輕的

Channel 對象,用于與服務端進行網絡通信。

\1. 管理信息:

a. 連接關聯的實際用于通信的 muduo::net::Connection 連接

b. 連接關聯的信管理句柄(實現信道的增刪查)

c. 連接關聯的 EventLoop 異步循環工作線程

d. 異步工作線程池(用于對收到服務器推送過來的消息進行處理的線程池)

\2. 管理操作:

a. 提供創建 Channel 信道的操作

b. 提供刪除 Channel 信道的操作

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

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

相關文章

小白也能看懂!OpenCV 從零開始安裝配置全教程(包含Windows / Ubuntu / 樹莓派)系統詳細操作配置教程

小白也能看懂!OpenCV 從零開始安裝配置全教程(包含Windows / Ubuntu / 樹莓派)系統詳細操作配置教程 摘要 本教程是面向“小白也能懂”的OpenCV安裝與配置全攻略,涵蓋Windows、Ubuntu和樹莓派三大平臺,真正實現“從零…

【華為云】容器鏡像服務 SWR 詳解:從上傳下載到 ModelArts 應用

前言 華為云容器鏡像服務(Software Repository for Container,簡稱 SWR)是華為云提供的企業級容器鏡像倉庫服務。它支持 Docker 鏡像的存儲、管理和分發,為容器化應用提供安全可靠的鏡像托管服務。本文將詳細介紹 SWR 的核心功能…

計算機網絡知識點梳理(一)概述:組成、發展、性能、體系結構等

目錄 一、互聯網 (1)特點 (2)網絡的組成 (3)網絡、互連網、因特網 (4)互聯網發展的三個階段 (5)標準化 (6)組成 二、計算機網…

不同行業視角下的數據分析

聲明:以下部分內容含AI生成 基于行業維度來劃分數據分析崗位,可以幫助我們更好地理解不同行業對數據分析技能、業務知識和職業發展的獨特要求。 目錄 一、總體框架:為什么行業維度如此重要? 二、主要行業劃分及詳細講解 1. 互聯…

「CTF」青少年CTF·雛形系統

題目&#xff1a; 解題過程 嘗試隨便輸入點什么&#xff0c;沒有結果 使用dirsearch掃描網址目錄 可以看到有掃描到一個www.zip&#xff0c;zip文件大概率有需要的東西 網址后加上www.zip就能對該文件進行下載 文件解壓縮后如下 打開qsnctf.php&#xff0c;代碼內容如下 <…

Java實戰項目演示代碼及流的使用

project 準備牌->洗牌->發牌 import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet;public class PokerGameplus {static HashMap<Integer,String> hs new HashMap<>();static ArrayList<Int…

使用 OpenLayers + 高德瓦片源實現旅游足跡地圖

作為一個熱愛旅行的開發者&#xff0c;我一直想要一個能夠記錄和展示自己旅游足跡的功能。市面上雖然有很多地圖應用&#xff0c;但大多功能復雜&#xff0c;而我只需要一個簡單直觀的方式來標記去過的地方和想去的地方。 于是我決定在自己的個人網站上實現一個旅游足跡地圖功…

Redis基礎(含常用命令等以快速入門)

一、初步認識 1、NoSQL SQL 關系型數據庫&#xff08;表結構&#xff0c;強一致&#xff09;NoSQL 非關系型數據庫&#xff08;靈活結構&#xff0c;最終一致&#xff0c;水平擴展爽&#xff09; 維度SQL&#xff08;關系型&#xff09;NoSQL&#xff08;非關系型&#xf…

OSPF特殊區域、路由匯總及其他特性

OSPF路由器需要同時維護域內路由、域間路由、外部路由信息數據庫。當網絡規模不斷擴大時&#xff0c;LSDB規模也不斷增長。如果某區域不需要為其他區域提供流量中轉服務&#xff0c;那么該區域內的路由器就沒有必要維護本區域外的鏈路狀態數據庫。OSPF通過劃分區域可以減少網絡…

在緩存Cacheable注解中Key值如何使用常量

1.在常量類中定義商品緩存空間和商品緩存KEY public interface CacheConstants {/*** Goods Cache Name*/String QNA_GOODS_CACHE "qna-goods";/*** Goods Cache key*/String QNA_GOODS_CACHE_KEY "qna_goods:";/*** Order Cache Name*/String QNA_ORDER…

sklearn聚類

在此將sklearn官網的一張關于聚類算法比較的圖片放過來。 下面的表格是根據sklearn官網翻譯而來。 方法名稱 參數 可擴展性 應用場景 幾何度量(距離) MiniBatchKMeans 簇的數量 非常適合處理大量樣本和中等數量的簇(使用MiniBatch時) 通用型,適用于簇大小均勻、幾何形狀平…

Recharts:React圖表庫,組件化設計助力高效數據可視化開發

你寫前端項目時有沒有卡過數據可視化的坑&#xff1f;比如要做個用戶增長折線圖&#xff0c;查了半天原生 JS 教程&#xff0c;寫了幾十行代碼&#xff0c;結果要么坐標軸對不上&#xff0c;要么數據渲染不出來&#xff1b;或者用了某個圖表庫&#xff0c;文檔全是英文&#xf…

Java 中String類的常用方法

Java 中的 String 類提供了豐富的方法用于字符串操作&#xff0c;以下是最常用的一些方法分類總結&#xff1a; 一、獲取字符串信息length()&#xff1a;返回字符串長度&#xff08;字符個數&#xff09; String s "hello"; int len s.length(); // len 5charAt(i…

【記錄】Docker|Docker內部訪問LInux主機上的Ollama服務

部分內容參考自&#xff1a;使得 docker 容器內部可以訪問宿主機的 ollama 服務_docker 訪問 ollama-CSDN 博客&#xff0c;補充添加了更多的細節&#xff0c;也補充了一個更加簡單的方案。 我測試的系統版本&#xff1a;Ubuntu 24.04.2 LTS noble&#xff0c;查看方式是指令 l…

數據庫物理外鍵與邏輯外鍵全解析

一、核心概念 1. 物理外鍵 (Physical Foreign Key) 物理外鍵是數據庫層面通過語法明確創建的外鍵約束。它是由數據庫管理系統&#xff08;DBMS&#xff09;本身&#xff08;如 MySQL, PostgreSQL, Oracle&#xff09;來強制實現的。 它是什么&#xff1a;數據庫表結構的一部分&…

Vue3入門到實戰,最新版vue3+TypeScript前端開發教程,創建Vue3工程,筆記03

筆記03 一、創建Vue3項目 1.1、創建方式 使用vue-cli創建使用vite創建&#xff08;推薦&#xff09;Vue3官網創建項目文檔 兩種創建方式&#xff0c;推薦使用第二種。vue-cli是基于webpack實現的&#xff0c;vite是新一代前端構建工具。 2.1、vue3項目結構

企業如何利用群暉 NAS 構建高效數據備份與容災體系

在數字化轉型的過程中&#xff0c;企業數據已成為核心資產。然而&#xff0c;勒索病毒攻擊、硬件故障、操作失誤以及自然災害等風險&#xff0c;都可能導致數據丟失甚至業務中斷。如何構建一個高效、安全、可恢復的數據備份與容災體系&#xff0c;已成為企業 IT 管理的關鍵課題…

關于在pycharm終端連接服務器

1、先為每個項目創建一個虛擬環境2、使用命令下載torchpip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple安裝之后發現安裝在了本地&#xff0c;我需要安裝到服務器里面&#xff0c;此時可以把本地的刪除&#xff0c;因為是默認安裝到c盤&#xff0c;除非你指定路…

CSS 繼承 (Inheritance)

一、核心概念CSS 繼承是指某些 CSS 屬性如果被設置在父元素上&#xff0c;其值會自動流向&#xff08;應用到&#xff09;其所有后代元素&#xff08;子、孫元素等&#xff09;的特性。核心價值&#xff1a;通過將樣式聲明應用于祖先元素&#xff0c;可以避免在所有后代元素上重…

UGUI源碼剖析(15):Slider的運行時邏輯與編輯器實現

UGUI源碼剖析&#xff08;第十五章&#xff09;&#xff1a;Slider的運行時邏輯與編輯器實現 在之前的章節中&#xff0c;我們已經深入了UGUI眾多核心組件的運行時源碼。然而&#xff0c;一個完整的Unity組件&#xff0c;通常由兩部分構成&#xff1a;定義其在游戲世界中行為的…