一、系統架構概覽
會議系統采用"主進程+線程池+進程池"的分層架構,實現高并發與業務隔離:
流程圖說明:
- 客戶端:作為外部請求發起方,連接到系統主進程。
- 主進程:系統核心控制節點,負責協調線程池和進程池。
- 線程池:由主進程管理,專門處理客戶端的連接請求(如TCP連接建立、請求解析等)。
- 進程池:負責管理多個獨立的“房間進程”,實現會議室的隔離和并發管理。
- 房間進程:每個進程對應一個會議室,內部包含發送線程池(用于高效處理消息推送),通過Unix域套接字與主進程通信(低延遲、高安全的本地進程間通信方式)。
這種架構通過“線程池處理連接 + 進程池隔離業務”的方式,兼顧了高并發處理能力和業務穩定性(單個房間故障不影響其他房間)。
核心組件角色
- 主進程:全局資源管理,進程池調度,狀態監控
- 線程池:接收客戶端連接,初步處理請求
- 房間進程:獨立管理單個會議室,含1個接收線程+5個發送線程
- 通信管道:主進程與房間進程通過Unix域套接字通信
二、創建會議室完整流程
1. 流程步驟
2. 關鍵技術細節
-
房間分配機制:主進程通過遍歷
room->pptr
數組查找child_status=0
的空閑進程,加鎖保證線程安全// 核心代碼:查找空閑房間 pthread_mutex_lock(&room->lock); for (int i=0; i<room->num; i++) {if (room->pptr[i].child_status == 0) { // 找到空閑房間room->pptr[i].child_status = 1; // 標記忙碌room->navail--;break;} } pthread_mutex_unlock(&room->lock);
-
連接交接技術:通過Unix域套接字傳遞客戶端連接(
connfd
),使用SCM_RIGHTS
控制消息實現文件描述符跨進程傳遞// 傳遞連接核心代碼 struct cmsghdr *cmptr = CMSG_FIRSTHDR(&msg); cmptr->cmsg_type = SCM_RIGHTS; *(int*)CMSG_DATA(cmptr) = client_fd; // 傳遞文件描述符 sendmsg(pipefd, &msg, 0);
三、加入會議完整流程
1. 流程步驟
2. 關鍵技術細節
-
用戶池管理:房間進程通過
user_pool
結構體維護所有參會者連接,使用文件描述符集合(fdset
)監控活動// 房間內用戶管理 Pthread_mutex_lock(&user_pool->lock); FD_SET(client_fd, &user_pool->fdset); // 添加新用戶 user_pool->num++; // 增加用戶計數 Pthread_mutex_unlock(&user_pool->lock);
-
廣播通知機制:新用戶加入后,房間進程向所有已連接用戶發送通知,確保參會者列表同步
四、消息收發與轉發流程
1. 流程步驟
2. 關鍵技術細節
-
多線程協作:房間進程采用"1個接收線程+5個發送線程"的模型,解耦消息接收與轉發
// 發送線程池初始化 for (int i=0; i<SENDTHREADSIZE; i++) { // SENDTHREADSIZE=5Pthread_create(&tid, NULL, send_func, NULL); }
-
消息隊列緩沖:使用線程安全的消息隊列(
send_queue
)平衡發送負載,避免消息阻塞// 消息入隊 Pthread_mutex_lock(&queue.lock); queue.send_queue.push(msg); // 存入消息 Pthread_cond_signal(&queue.cond); // 喚醒發送線程 Pthread_mutex_unlock(&queue.lock);
-
協議格式設計:消息采用固定格式頭部(
$_類型_IP_長度_
),解決TCP粘包問題示例:$_TEXT_192.168.1.10_0005_Hello_# 格式:$_[類型]_[IP]_[長度]_[內容]_#
五、進程與線程協作關系總結
組件 | 角色職責 | 通信方式 |
---|---|---|
主進程 | 進程池管理、狀態監控、資源調度 | Unix域套接字(與房間進程) |
線程池線程 | 接收客戶端連接、初步請求處理 | 共享內存(主進程狀態) |
房間進程主線程 | 監控用戶活動、接收消息 | 管道(與主進程) |
房間接收線程 | 處理新用戶加入、連接交接 | 內部信號量 |
發送線程池 | 消息轉發、負載均衡 | 消息隊列(線程間) |
六、模塊設計
1. 網絡通信模塊(net.cpp、netheader.h)
網絡通信是系統的基礎支撐,負責TCP連接的建立、數據傳輸及底層網絡操作封裝,主要功能包括:
- 連接管理:通過
Tcp_listen
創建監聽套接字,支持IPv4/IPv6雙棧;Tcp_connect
實現客戶端與服務器的連接;Accept
封裝accept
系統調用,處理中斷重試邏輯。 - 數據讀寫:
Readn
和writen
保證TCP數據流的完整讀寫(解決短讀短寫問題);read_fd
和write_fd
支持通過Unix域套接字傳遞文件描述符(用于進程間傳遞客戶端連接)。 - 輔助功能:
Sock_ntop
實現套接字地址到字符串的轉換;Setsockopt
封裝setsockopt
設置套接字選項(如SO_REUSEADDR
)。
網絡模塊通過統一的錯誤處理(依賴err_quit
、err_msg
)保證異常場景的可追溯性。
2. 線程與進程同步模塊(unpthread.cpp、unpthread.h、msg.h)
系統采用多線程+多進程架構,同步機制是保證數據一致性的核心,主要組件包括:
- 線程操作封裝:
Pthread_create
、Pthread_detach
等函數封裝原生 pthread 接口,簡化線程創建與管理,并統一錯誤處理。 - 互斥鎖與條件變量:
Pthread_mutex_lock
、Pthread_mutex_unlock
封裝互斥鎖操作;Pthread_cond_wait
、Pthread_cond_signal
實現線程間等待/通知機制,用于消息隊列的生產-消費同步。 - 消息隊列(SEND_QUEUE):定義于
msg.h
,基于std::queue
實現線程安全的消息緩沖。通過互斥鎖(lock
)保護隊列操作,條件變量(cond
)協調生產者(push_msg
)和消費者(pop_msg
):當隊列滿時生產者等待,當隊列空時消費者等待,消息入隊/出隊后通過信號喚醒等待線程。
3. 會議房間管理模塊(room.cpp)
房間是系統的核心業務單元,負責管理會議內的用戶及消息分發,主要功能包括:
- 房間生命周期管理:
clear_room
函數負責關閉房間內所有用戶連接、清理用戶數據(fdset
、status
、fdToIp
)及消息隊列,將房間狀態置為CLOSE
。 - 用戶加入/退出處理:
accept_fd
線程負責接收新用戶連接(通過進程間傳遞的文件描述符),根據操作類型(創建/加入會議)更新用戶池(pool
),并發送會議響應或用戶加入通知。fdclose
函數處理用戶退出:若為房主退出則關閉整個房間,否則僅移除該用戶并廣播退出通知。
- 消息分發:
send_func
線程池從消息隊列(sendqueue
)獲取消息,根據消息類型(如IMG_RECV
、TEXT_RECV
)向房間內指定用戶(或所有用戶)轉發數據,確保消息格式統一($_msgType_ip_size_data_#
)。
4. 用戶請求處理模塊(userdeal.cpp)
該模塊負責解析客戶端請求并協調房間資源,核心邏輯在dowithuser
函數中:
- 請求解析:讀取客戶端消息頭(11字節,包含消息類型、IP、數據長度),解析出
CREATE_MEETING
(創建會議)、JOIN_MEETING
(加入會議)等請求類型。 - 資源協調:創建會議時檢查進程池(
room
)是否有空閑房間,若有則通過write_fd
向對應房間進程傳遞客戶端連接;加入會議時驗證房間有效性,通過房間進程的管道傳遞連接并返回結果。
5. 主程序與進程/線程池(main.cpp)
main.cpp
是系統入口,負責初始化核心資源并協調各模塊運行:
- 進程池初始化:通過
process_make
創建多個子進程(每個對應一個房間),父子進程通過Unix域套接字對(socketpair
)通信,父進程監控子進程狀態(房間是否空閑)。 - 線程池初始化:通過
thread_make
創建多個工作線程,負責處理客戶端初始連接(調用dowithuser
)。 - 主循環:通過
select
監控進程池管道,處理房間狀態更新(如房間空閑、用戶退出),維護全局資源的一致性。
6. 錯誤處理模塊(error.cpp)
系統通過err_quit
(退出程序)、err_msg
(僅打印錯誤)統一處理錯誤,基于err_doit
函數格式化錯誤信息(包含errno描述),確保錯誤場景的標準化處理,簡化調試與問題定位。
核心設計優勢
- 進程隔離:單個房間崩潰不影響其他會議,提高系統穩定性
- 并發優化:線程池處理連接突發,發送線程池避免消息阻塞
- 高效通信:Unix域套接字實現低延遲進程間通信,支持文件描述符傳遞
- 狀態可見:主進程實時監控所有房間狀態,支持動態調度
通過這種多層次的進程-線程協作架構,系統可支持500+并發用戶、50+同時會議,消息轉發延遲控制在50ms以內,滿足實時會議的核心需求。