当前位置: 首页 > news >正文

会议系统核心流程详解:创建、加入与消息交互

一、系统架构概览

会议系统采用"主进程+线程池+进程池"的分层架构,实现高并发与业务隔离:

Unix域套接字通信
Unix域套接字通信
客户端
主进程
线程池
处理连接接收
进程池
管理会议室
房间进程1
含发送线程池
房间进程2
含发送线程池
房间进程N
含发送线程池

流程图说明:

  1. 客户端:作为外部请求发起方,连接到系统主进程。
  2. 主进程:系统核心控制节点,负责协调线程池和进程池。
  3. 线程池:由主进程管理,专门处理客户端的连接请求(如TCP连接建立、请求解析等)。
  4. 进程池:负责管理多个独立的“房间进程”,实现会议室的隔离和并发管理。
  5. 房间进程:每个进程对应一个会议室,内部包含发送线程池(用于高效处理消息推送),通过Unix域套接字与主进程通信(低延迟、高安全的本地进程间通信方式)。

这种架构通过“线程池处理连接 + 进程池隔离业务”的方式,兼顾了高并发处理能力和业务稳定性(单个房间故障不影响其他房间)。

核心组件角色

  • 主进程:全局资源管理,进程池调度,状态监控
  • 线程池:接收客户端连接,初步处理请求
  • 房间进程:独立管理单个会议室,含1个接收线程+5个发送线程
  • 通信管道:主进程与房间进程通过Unix域套接字通信

二、创建会议室完整流程

1. 流程步骤

客户端线程池线程主进程房间进程(空闲)发送 CREATE_MEETING 请求请求分配空闲房间查找空闲房间进程(遍历room->>pptr)返回房间索引i通过管道传递connfd+命令'C'接收线程(accept_fd)处理连接标记客户端为房主(user_pool->>owner)返回会议室创建成功状态更新为"忙碌"(child_status=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. 流程步骤

客户端线程池线程主进程目标房间进程(忙碌)房间内其他客户端发送 JOIN_MEETING(房间ID) 请求请求连接目标房间ID通过管道传递connfd+命令'J'接收线程添加用户到user_pool广播"新用户加入"通知返回加入成功更新用户数(total++)客户端线程池线程主进程目标房间进程(忙碌)房间内其他客户端

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. 流程步骤

发送客户端房间进程发送线程池接收客户端1接收客户端2发送消息(文字/图片)主线程读取消息头解析类型完整接收消息体将消息加入发送队列转发消息(含发送者信息)转发消息(含发送者信息)消息发送完成确认发送客户端房间进程发送线程池接收客户端1接收客户端2

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. 进程隔离:单个房间崩溃不影响其他会议,提高系统稳定性
  2. 并发优化:线程池处理连接突发,发送线程池避免消息阻塞
  3. 高效通信:Unix域套接字实现低延迟进程间通信,支持文件描述符传递
  4. 状态可见:主进程实时监控所有房间状态,支持动态调度

通过这种多层次的进程-线程协作架构,系统可支持500+并发用户、50+同时会议,消息转发延迟控制在50ms以内,满足实时会议的核心需求。

http://www.dtcms.com/a/331372.html

相关文章:

  • 卫星通信链路预算之七:上行载噪比计算
  • MySQL-dble分库分表方案
  • 【最新版】怎么下载mysqlclient并成功安装?
  • 物化视图优先迁移大表,缩短逻辑迁移时间
  • MySql——binlog和redolog的区别
  • uniapp开发动态添加密码验证
  • Go语言全面解析:从入门到精通
  • C/C++ 指针与内存操作详解——从一级指针到字符串转换函数的完整解析
  • 拒绝“孤岛式”作战,全方位构筑隧道应急通信解决方案
  • Java 学习笔记(基础篇2)
  • 13、C 语言结构体尺寸知识点总结
  • LeetCode 刷题【41. 缺失的第一个正数】
  • 【力扣322】零钱兑换
  • 非容器方式安装Prometheus和Grafana,以及nginx配置访问Grafana
  • GraphRAG查询(Query)流程实现原理分析
  • NetLimiter:精准掌控网络流量,优化网络体验
  • 《中国人工智能安全承诺框架》发布
  • arthas火焰图怎么看
  • 搭建 Docker 私有仓库
  • 前端css学习笔记5:列表表格背景样式设置
  • 【Golang】Golang内存泄漏问题排查(二)
  • 服务器路由相关配置Linux和Windows
  • Android POS应用在android运行常见问题及解决方案
  • 当消息队列遇上AI:飞算JavaAI实现智能流量调度与故障自愈实践
  • 在 Windows 系统中解决 Git 推送时出现的 Permission denied (publickey) 错误,请按照以下详细步骤操作:
  • LE AUDIO---Common Audio Service
  • C#WPF实战出真汁02--登录界面设计
  • STM32学习笔记11-通信协议-串口基本发送与接收
  • 从轨道根数计算惯性系到轨道系旋转矩阵
  • 2020/12 JLPT听力原文 问题二 1番