trantor 网络库学习总结 学习周期:一个多月 覆盖范围:trantor 全部核心模块,共 18 课
一、整体架构鸟瞰 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ┌─────────────────────────────────────────────────────────┐ │ 用户代码 / Drogon 框架 │ ├─────────────────────────────────────────────────────────┤ │ TcpServer / TcpClient │ │ • 连接管理(connSet_) • Round-Robin 分配 │ │ • TimingWheel 超时 • promise/future 优雅停止 │ ├────────────────┬────────────────────────────────────────┤ │ TcpConnection │ TaskQueue(Serial / Concurrent) │ │ • 状态机 │ • 卸载阻塞操作 │ │ • 发送队列 │ • SerialTaskQueue = EventLoopThread │ │ • TLS透明层 │ • ConcurrentTaskQueue = 线程池 │ ├────────────────┴────────────────────────────────────────┤ │ EventLoopThread / EventLoopThreadPool │ │ • 3阶段 promise/future 启动协议 │ │ • atomic round-robin 无锁分配 │ ├──────────┬──────────────┬──────────────────────────────┤ │ Acceptor │ Connector │ Resolver(DNS 异步解析) │ │ idleFd_ │ EINPROGRESS │ • NormalResolver(线程池) │ │ EMFILE │ 指数退避 │ • AresResolver(c-ares) │ ├──────────┴──────────────┴──────────────────────────────┤ │ EventLoop(Reactor 核心) │ │ loop() ← Channel ← Poller(epoll/kqueue/IOCP) │ │ runInLoop / queueInLoop / runAfter / runEvery │ │ MpscQueue<Func>:无锁任务投递 │ ├──────────────────────────┬──────────────────────────────┤ │ 定时器系统 │ 工具层 │ │ TimerQueue(最小堆) │ MsgBuffer / Logger │ │ TimingWheel(O(1) 超时) │ ObjectPool / MpscQueue │ │ timerfd / wakeupFd 驱动 │ Hash / secureRandomBytes │ └──────────────────────────┴──────────────────────────────┘ ↓ OS:epoll / kqueue / IOCP / wepoll 二、18 课核心知识点速查 阶段一:基础工具层(第 1-4 课) 第 1 课 — 日志系统 LOG_INFO << "msg" 展开为 Logger(__FILE__, __LINE__).stream(),析构时刷出 FixedBuffer<N>:栈上固定缓冲,避免日志路径的堆分配 AsyncFileLogger:前台线程写入内存队列,后台线程批量刷盘(异步、不阻塞 I/O) 自定义输出:Logger::setOutputFunction(),可对接 ELK、syslog 等 第 2 课 — 消息缓冲区 MsgBuffer 双指针设计:_readIndex / _writeIndex,中间是可读数据,右侧是可写空间 prepend 区域(8字节):预留报头空间,避免插入时移动数据 readFd():readv + 栈上 65536 字节备用缓冲,单次 syscall 读取大量数据 BufferNode 4种子类:MemBufferNode、FileBufferNodeUnix、FileBufferNodeWin、AsyncStreamBufferNode 第 3 课 — 日期时间与工具函数 Date:微秒精度时间点(int64_t microSecondsSinceEpoch_),可作定时器 key Date::now() → gettimeofday / GetSystemTimeAsFileTime NonCopyable:= delete 拷贝构造和赋值,所有核心类的基类 第 4 课 — 回调类型定义 ConnectionCallback:连接建立/断开 RecvMessageCallback:收到数据(TcpConnectionPtr + MsgBuffer*) WriteCompleteCallback:发送缓冲区清空 TimerCallback:定时器触发 阶段二:Reactor 核心(第 5-8 课) 第 5 课 — EventLoop 核心循环:epoll_wait → 分发 Channel 事件 → 执行 pendingFunctors_ wakeupFd_(eventfd/pipe):跨线程唤醒阻塞的 epoll_wait runInLoop(f):当前线程直接执行;其他线程 → queueInLoop → 唤醒 → 下轮执行 MpscQueue<Func> funcs_:任务队列用无锁 MPSC 队列,多线程投递无锁 关键不变量:EventLoop 是单线程的,所有网络操作必须在其线程执行。
...