网狐的定时器引擎架构理解

该定时器引擎基于线程驱动 + 时间片轮询 + 队列事件分发 的核心思路实现,整体架构分为定时器管理定时线程驱动事件分发三个核心模块,以下是详细的实现流程和原理:

一、核心设计思路
  1. 时间片轮询:通过独立线程以固定时间间隔(默认 25ms)触发时间检查,避免高频系统调用,降低资源消耗;
  2. 定时器对象池:维护 "空闲 / 活跃" 定时器链表,复用定时器对象减少内存分配开销;
  3. 事件队列分发:定时器到期后不直接执行逻辑,而是将事件投递到队列服务,由业务层异步处理,解耦定时器核心与业务逻辑。

二、核心组件与依赖

组件 作用
CTimerThread 定时器驱动线程,以固定时间片睡眠后触发时间检查
CTimerEngine 定时器核心管理器,负责定时器的增删、时间计算、到期事件投递
CQueueServiceEvent 事件投递器,将到期的定时器事件投递到队列服务(IQueueService)
CQueueService 队列服务,接收定时器事件并异步分发给业务层的回调接口
三、完整实现流程
1. 初始化阶段(BeginService)
cpp 复制代码
// TimerEngine.cpp -> CTimerEngine::OnTimerThreadSink
void CTimerEngine::OnTimerThreadSink() {
    CThreadLockHandle LockHandle(&m_ThreadLock);
    // 1. 无活跃定时器则直接返回
    if (m_dwTimeLeave==NO_TIME_LEFT) return;
    // 2. 累计已过时间,更新剩余时间
    m_dwTimeLeave -= m_dwTimerSpace;
    m_dwTimePass += m_dwTimerSpace;
    // 3. 检查是否有定时器到期(m_dwTimeLeave==0表示到检查点)
    if (m_dwTimeLeave==0) {
        DWORD dwTimeLeave=NO_TIME_LEFT;
        for (INT_PTR i=0;i<m_TimerItemActive.GetCount();) {
            tagTimerItem* pTimerItem = m_TimerItemActive[i];
            // 计算当前定时器剩余时间
            pTimerItem->dwTimeLeave -= m_dwTimePass;
            // 4. 定时器到期
            if (pTimerItem->dwTimeLeave==0L) {
                // 投递定时器事件到队列服务
                m_AttemperEvent.PostTimerEvent(pTimerItem->wTimerID, pTimerItem->wBindParam);
                // 5. 处理重复次数
                if (pTimerItem->dwRepeatTimes != TIMER_REPEAT_TIMER) {
                    if (pTimerItem->dwRepeatTimes==1) {
                        // 单次定时器:移到空闲池
                        m_TimerItemActive.RemoveAt(i);
                        m_TimerItemFree.Add(pTimerItem);
                        bKillTimer=true;
                    } else {
                        // 多次定时器:减少次数,重置剩余时间
                        pTimerItem->dwRepeatTimes--;
                        pTimerItem->dwTimeLeave = pTimerItem->dwElapse;
                    }
                } else {
                    // 无限重复:重置剩余时间
                    pTimerItem->dwTimeLeave = pTimerItem->dwElapse;
                }
            }
            // 6. 更新全局最近到期时间
            if (!bKillTimer) {
                i++;
                dwTimeLeave=__min(dwTimeLeave, pTimerItem->dwTimeLeave);
            }
        }
        // 7. 重置时间累计,准备下一轮
        m_dwTimePass=0L;
        m_dwTimeLeave=dwTimeLeave;
    }
}

CTimerEngine::SetTimer → 初始化定时器 → CTimerThread(25ms轮询)→ OnTimerThreadSink(检查到期) → CQueueServiceEvent::PostTimerEvent → CQueueService::AddToQueue → 队列线程异步触发业务回调

总结:该定时器引擎是典型的 "时间片轮询 + 对象池 + 事件队列" 实现,兼顾了性能、线程安全和业务解耦,适合服务端高并发场景下的定时任务管理。

相关推荐
2401_843253704 小时前
Agent消息降级矩阵:当告警卡片遇到纯文本SMS渠道
架构
奈斯先生Vector5 小时前
AI 辅助线上排障工作台:从故障证据、Codex 协作到可回放修复
人工智能·架构·开源·aigc·midjourney
代码方舟6 小时前
零信任架构实战:基于天远柠檬查出险-登记证API构建自动化车辆履约评估网关
人工智能·python·架构·自动化
程序员讲BPM工作流6 小时前
基于Petri网建模原理:原生自研信创BPM流程引擎工作流模式架构解析
架构
明源云6 小时前
租赁管理系统软件推荐:如何选到真正好用的不动产租赁管理软件
大数据·人工智能·架构
头茬韭菜7 小时前
第 2 篇:「Fluss 架构深入」—— CoordinatorServer、TabletServer 与存储引擎
架构·fluss
无忧智库8 小时前
企业数字化底座与数字化转型方案拆解:从贴源数据区到管理分析平台的完整落地路径(PPT)
大数据·架构
无忧智库8 小时前
烟草物流企业数字化转型规划方案拆解:从战略绩效到物流作业的全链条信息化设计(PPT)
大数据·架构
小园子的小菜10 小时前
RocketMQ 核心原理、架构优势与核心机制全解
架构·rocketmq
敲代码的玉米C10 小时前
让两个模型一写一审
前端·人工智能·架构