知识卡片

RTB引擎的准实时热插拔算法架构:动态链接库+文件系统事件通知

结构图卡

内容

RTB引擎的算法模块被设计成”相互正交、可热插拔”的结构,允许多条算法链并行拆分流量做A/B测试,这背后依赖的是Linux下动态链接库的运行时加载能力,配合一套文件系统变化通知机制实现”配置一改、算法立刻生效”的准实时更新,而不需要重启整个RTB服务(对一个每天处理百亿级请求、要求50毫秒内响应的系统而言,重启服务本身就是不可接受的代价)。具体实现依靠三个系统调用:dlopen负责在程序运行时打开一个动态链接库文件,dlsym负责从已加载的库里获取具体函数的地址(拿到函数指针后就能像调用本地函数一样调用库里的实现),dlclose负责在不再需要时卸载这个库、释放资源。仅靠这三个函数已经能做到”运行时加载新算法”,但要做到”文件一改、立刻感知并重新加载”,还需要额外注册inotify事件来监控配置文件——inotify是Linux提供的文件系统事件通知机制,能在文件被修改、增加、删除时第一时间把这个变化通知给用户态程序,RTB进程启动时就向系统注册了对配置文件的inotify监控,一旦运维修改了配置文件,程序立刻收到通知并重新加载对应的算法动态库,整个过程不需要人工介入重启,也不需要轮询检查文件是否变化。为了支撑A/B测试,流量在流经不同算法链时还会被打上不同的算法标签,这个标签会持续跟随到后续的展现、点击环节,从而能追踪不同算法版本各自的实际效果。

结构图

flowchart LR
    A["配置文件被修改\n(切换算法版本/参数)"] -->|"inotify事件\n(文件变化通知)"| B["RTB进程收到通知"]
    B --> C["dlclose 卸载旧算法动态库"]
    C --> D["dlopen 加载新算法动态库"]
    D --> E["dlsym 获取新算法函数指针"]
    E --> F["新算法立即生效\n无需重启服务"]
    F --> G["流量按配置拆分\n打上算法标签"]
    G --> H["标签跟随展现/点击\n用于A/B测试效果分析"]

参考来源

- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.7 互联网DSP广告系统架构及关键技术解析"节,"2.7.6 RTB投放引擎的架构"及"2.7.13 疑问与解惑"(源文件:_epub-src/OEBPS/Text/Chapter2_7_7.xhtml、Chapter2_7_14.xhtml) - 结论依据:原文说明"算法模块允许热插拔,编译完成的动态链接库可根据配置文件的变化实时进行加载和卸载",以及问答环节详细说明"利用dlopen、dlsym、dlclose这3个函数……我们还使用了一种文件系统的变化通知机制……向系统注册了inotify事件来监控配置文件,当配置文件被修改的时候立即通知程序重新加载配置文件",共同支撑本卡片结论与结构图。 - 原始内容:算法模块允许热插拔,编译完成的动态链接库可根据配置文件的变化实时进行加载和卸载,允许多算法链并行拆分流量进行A/B测试……我们还使用了一种文件系统的变化通知机制……向系统注册了inotify事件来监控配置文件,当配置文件被修改的时候立即通知程序重新加载配置文件。