会议系统核心流程详解:创建、加入与消息交互
一、系统架构概览
会议系统采用"主进程+线程池+进程池"的分层架构,实现高并发与业务隔离:
流程图说明:
- 客户端:作为外部请求发起方,连接到系统主进程。
- 主进程:系统核心控制节点,负责协调线程池和进程池。
- 线程池:由主进程管理,专门处理客户端的连接请求(如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域套接字(与房间进程) |
线程池线程 | 接收客户端连接、初步请求处理 | 共享内存(主进程状态) |
房间进程主线程 | 监控用户活动、接收消息 | 管道(与主进程) |
房间接收线程 | 处理新用户加入、连接交接 | 内部信号量 |
发送线程池 | 消息转发、负载均衡 | 消息队列(线程间) |
核心设计优势
- 进程隔离:单个房间崩溃不影响其他会议,提高系统稳定性
- 并发优化:线程池处理连接突发,发送线程池避免消息阻塞
- 高效通信:Unix域套接字实现低延迟进程间通信,支持文件描述符传递
- 状态可见:主进程实时监控所有房间状态,支持动态调度
通过这种多层次的进程-线程协作架构,系统可支持500+并发用户、50+同时会议,消息转发延迟控制在50ms以内,满足实时会议的核心需求。