从零搭建高可用广告联盟系统:核心技术栈 + 踩坑全记录

张开发
2026/4/14 4:49:15 15 分钟阅读

分享文章

从零搭建高可用广告联盟系统:核心技术栈 + 踩坑全记录
作为一名深耕流量变现领域 6 年的后端开发我见过太多团队在广告联盟系统上栽跟头要么是技术选型错误导致高并发下系统崩溃要么是风控缺失被刷量刷到血本无归要么是结算逻辑漏洞引发财务纠纷。最近半年我带着团队重构了我们内部使用了 3 年的广告联盟系统支撑了日均 10 亿次广告请求、99.99% 的可用性也踩遍了从需求设计到上线运维的所有坑。今天就把完整的技术实现思路、核心难点和避坑指南分享出来希望能帮到想做广告联盟系统的开发者和技术负责人。一、先想清楚为什么 90% 的自研广告联盟系统会失败在动手写代码之前先搞明白广告联盟系统的本质它不是一个简单的 广告展示系统而是一个高并发、强一致性、高风控要求的交易系统。它的核心复杂度不在于 展示广告而在于 精准匹配、实时统计、防作弊、自动化结算 这四个环节。我见过的失败案例几乎都踩了这几个坑低估了并发量用普通的 Web 架构支撑广告请求高峰期直接雪崩忽视了风控上线一周就被羊毛党刷走几十万广告费数据统计不准广告主和流量主两边对账对不上天天扯皮结算逻辑混乱各种特殊情况没考虑到财务每月加班算工资所以我们在设计之初就定下了三个原则性能优先、数据绝对准确、风控前置。所有的技术选型和架构设计都围绕这三个原则展开。二、整体技术架构支撑日均 10 亿请求的微服务设计我们采用了 分层解耦 分布式计算 的微服务架构整体分为接入层、业务层、数据层和基础服务层每个模块独立部署、水平扩展。核心架构图文字版plaintext客户端流量主SDK/广告主后台 ↓ 接入层NginxLVSAPI网关 ↓ 业务层微服务集群 ├─ 广告匹配服务核心 ├─ 数据上报服务 ├─ 广告主管理服务 ├─ 流量主管理服务 ├─ 结算服务 ├─ 风控服务 └─ 素材管理服务 ↓ 数据层 ├─ 缓存Redis Cluster ├─ 消息队列Kafka ├─ 关系型数据库MySQL 主从 ├─ 时序数据库ClickHouse └─ 搜索引擎Elasticsearch ↓ 基础服务注册中心、配置中心、监控告警、日志收集关键技术选型说明表格模块技术选型选型理由广告匹配引擎FlinkRedis实时计算用户标签毫秒级返回匹配结果数据统计ClickHouse支持 PB 级数据的秒级查询完美适配广告数据的多维分析消息队列Kafka高吞吐量支持每秒百万级数据上报解耦上下游服务缓存Redis Cluster分布式缓存存储热点广告、用户标签和实时统计数据数据库MySQLShardingSphere分库分表支撑海量数据保证事务一致性三、四大核心模块的技术实现与踩坑总结1. 广告匹配引擎毫秒级响应的核心广告匹配是整个系统的心脏要求99% 的请求在 10ms 内完成。我们的实现思路是 离线计算 实时计算 缓存加速 三层架构离线层每天凌晨用 Spark 计算用户的长期标签兴趣、地域、设备类型存入 Redis实时层用 Flink 实时处理用户的行为数据点击、浏览、转化更新用户的短期标签匹配层收到广告请求后先从 Redis 获取用户标签然后在内存中进行广告过滤和排序返回最优广告踩坑记录一开始我们把所有广告都放在内存中导致服务启动慢、内存占用高。后来改成了 热点广告缓存 冷数据按需加载 的模式内存占用降低了 70%匹配算法不要太复杂复杂的算法会增加响应时间。我们用了简单的加权排序算法结合 CTR 预估模型效果已经足够好2. 数据统计系统数据绝对准确是底线广告数据的准确性直接关系到钱差一个小数点都可能引发巨大的纠纷。我们采用了 至少一次上报 幂等处理 对账校验 的机制保证数据 100% 准确客户端 SDK 采用 本地缓存 重试机制确保曝光、点击数据至少上报一次服务端用雪花算法生成唯一的事件 ID通过数据库唯一索引实现幂等处理避免重复统计每天凌晨运行对账任务对比 ClickHouse 中的原始数据和 MySQL 中的统计数据发现不一致自动告警踩坑记录千万不要用 MySQL 做实时数据统计我们一开始用 MySQL 统计实时点击量高峰期数据库直接被打挂。后来迁移到 ClickHouse查询速度提升了 100 倍一定要做数据校验我们曾经因为 SDK 的一个 bug导致部分数据上报格式错误统计结果少了 30%花了一周时间才修复3. 风控防作弊系统广告联盟的生命线没有风控的广告联盟就是给羊毛党送钱。我们的风控系统分为 实时风控 离线风控 两层覆盖了从广告请求到结算的全流程实时风控在广告请求和点击时实时检查设备指纹、IP 地址、点击频率、行为模式发现异常直接拦截离线风控每天用机器学习模型分析历史数据识别批量刷量、恶意点击、虚假转化等行为封禁违规账号核心风控规则同一设备 24 小时内点击同一广告超过 3 次视为无效点击同一 IP 段 1 小时内出现超过 100 次点击直接封禁 IP 段点击后立即关闭页面、停留时间小于 1 秒视为无效点击设备指纹异常如模拟器、root 设备、虚拟机降低广告权重踩坑记录风控规则不能太严否则会误杀正常用户。我们一开始规则太严导致正常用户的点击被拦截流量主收益下降了 20%一定要有申诉渠道被误封的用户可以提交申诉我们会人工审核后解封4. 结算系统自动化、可追溯、零差错结算系统是最容易出问题的模块因为涉及到各种复杂的计费规则、佣金比例、扣税、退款等逻辑。我们的结算系统采用了 规则引擎 自动化结算 人工审核 的模式用规则引擎配置各种计费模式CPC/CPM/CPA/CPS和佣金比例支持灵活调整每月 1 号自动生成结算单计算每个流量主的收益、扣税和实发金额结算单生成后需要财务人工审核审核通过后自动打款踩坑记录结算逻辑一定要写单元测试我们曾经因为一个边界条件没考虑到导致部分流量主的收益计算错误花了很多时间道歉和补发一定要保留所有的结算记录至少保存 3 年以备审计和纠纷处理四、给想做广告联盟系统的开发者的几点建议不要从零开始搭建所有模块广告匹配、风控、结算这些核心模块技术复杂度非常高从零开发至少需要 6-12 个月。可以先基于成熟的开源框架做二次开发或者参考行业内的最佳实践。先做最小可行产品MVP不要一开始就追求大而全先实现最核心的功能广告展示、点击统计、基础结算。上线后根据用户反馈逐步迭代。风控一定要提前做不要等被刷量了才想起做风控。在系统设计之初就要把风控考虑进去否则上线后可能会遭受巨大的经济损失。重视用户体验对于流量主来说最重要的是收益稳定、结算及时对于广告主来说最重要的是投放效果好、数据准确。把这两点做好你的系统就成功了一半。五、写在最后广告联盟系统是一个技术和商业结合非常紧密的产品它不仅需要扎实的技术功底还需要对流量变现行业有深刻的理解。我们团队花了 3 年时间踩了无数坑才打磨出现在这套稳定、高效、可扩展的广告联盟系统。如果大家在搭建广告联盟系统的过程中遇到任何问题或者需要更详细的架构设计文档、SDK 接入示例、风控规则库可以私信我交流。我会把我们团队这几年积累的经验和资源分享给大家帮大家少走弯路。毕竟技术的价值在于分享希望能和更多志同道合的开发者一起交流学习。

更多文章