高并发服务器day10
Connection 模块核心设计解析1. 模块目的负责对通信连接进行全方位管理将所有与连接相关的操作统一封装在该模块内对外提供标准接口。2. 核心管理维度为了实现对连接的全面控制该模块主要负责管理以下 5 个核心部分套接字 (Socket)封装并管理底层的套接字基础操作。连接事件统一管理连接生命周期中的可读、可写、错误、挂断及其他任意事件。缓冲区管理发送与接收缓冲区保障 Socket 数据读写的高效性。协议上下文记录和追踪请求数据在各个阶段的处理过程与状态。回调函数通过回调机制将具体业务解耦交由用户自定义。包含以下场景数据接收回调连接收到数据后如何解析与处理。连接建立回调连接成功建立后的初始化或通知动作。连接关闭回调连接释放前的清理工作或善后处理。任意事件回调其他特殊事件产生时的自定义动作。3. 核心功能实现本模块向用户提供了以下关键功能接口异步发送数据提供的并非底层阻塞式发送接口。其机制是将数据放入发送缓冲区随后启动“写事件”监控交由事件循环完成真正的发送。安全关闭连接在实际释放连接资源前会严格检查输入/输出缓冲区确保所有残留的待处理数据被妥善处理后再断开。超时管控支持启动或取消非活跃连接的超时销毁功能有效防止死连接导致的资源泄漏。协议切换连接收到数据后的后续业务流转可根据当前的协议上下文及用户注册的业务回调函数进行动态切换和处理。4. 内存安全管理防止程序崩溃的利器Connection 模块作为所有连接操作的唯一入口其自身的生命周期管理直接关系到整个程序的稳定性。问题场景内存非法访问在复杂的网络通信中极易出现一种致命情况当我们正准备对某个连接进行操作时该连接却已经在其他地方被释放。这会导致内存访问错误野指针/悬垂指针最终直接引发程序崩溃。解决方案引入shared_ptr智能指针为了根除上述隐患系统采用shared_ptr对 Connection 对象进行全局接管。核心机制与优势引用计数保障当程序的任何位置需要操作 Connection 对象时都会持有一份shared_ptr使其引用计数 1。安全释放即使其他模块触发了释放连接的操作系统也仅仅是让shared_ptr的引用计数 -1。延迟销毁只有当所有持有该指针的模块都操作完毕引用计数归零时Connection 对象才会被真正析构销毁。这确保了在操作期间对象始终有效彻底杜绝了因提前释放导致的崩溃风险。致命的 “FD 复用” 与 “ABA 问题”文件描述符sockfd本质上是操作系统分配的一个较小的非负整数比如 10、11、12。当一个连接断开时它的sockfd会被系统立即回收并分配给下一个新建立的连接。危险场景重现客户端 A建立连接系统分配sockfd 10。A 发送了一个复杂查询请求EventLoop 收到后将其打包交给Worker 线程池处理。这个查询非常耗时需要 3 秒。在这 3 秒内客户端 A 突然掉线网络异常或主动断开。EventLoop 检测到断开调用close(10)销毁了连接对象。紧接着客户端 B发起连接。系统发现10号 FD 空闲于是将sockfd 10分配给了客户端 B。第 3 秒结束Worker 线程处理完了 A 的任务准备回写数据。如果系统只认sockfdWorker 线程会直接把A 的私密查询结果发送到了sockfd 10也就是现在的客户端 B的缓冲区里这就是经典的并发 ABA 问题。为了解决这个问题必须引入一个生命周期内绝对递增且永不重复的_conn_id如图中定义的uint64_t。在网络库对外暴露的回调函数中采用智能指针shared_ptr来传递连接对象核心目的只有一个把连接对象的生命周期控制权安全地交接或共享给上层业务代码彻底杜绝野指针崩溃。