項目模塊劃分
服務端模塊:
持久化數據管理中心模塊
在數據管理模塊中管理交換機,隊列,隊列綁定,消息等部分數據數據。
\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 信道的操作