当前位置: 首页 > article >正文

第三发 DSP 点击控制系统

背景

​ 在第三方 DSP 上投放广告,需要根据 DP Link 的点击次数进行控制。比如当 DP Link 达到 5000 后,后续的点击将不能带来收益,但是后续的广告却要付出成本。因此需要建立一个 DP Link 池,当 DP Link 到达限制后,我们可以调用 DSP 的 Marketing API 替换 DP Link。

技术框架

  1. 投放上报 接收上报的曝光、点击等行为

  2. 通过内部的 redis 队列,处理上报数据,然后新增一个 Kafka 队列,统计 DP Link 的点击数(使用 Redis 统计)

  3. 当点击数达到限制,判断当前 DP Link 是否替换过,如果没有替换过,向 DP Link 替换任务队列发送消息
    1. 之所以异步处理 DP Link 替换,是因为需要调用第三方 DSP 的 Marketing API,性能无法保证。而 Kafka Click Count 的队列消息的 QPS 非常高,非常容易积压。

    2. 每个 DP Linke 的最大限制数,需要从投放系统配置和获取。通过本地缓存提升性能

  4. DP Link 替换 的消费者:确保 DP Link 替换成功,需要手动执行 ACK
    1. 注意:将 DP Link 替换 设计成幂等性,防止有重复任务,确保不受影响。上游非常有可能重复提交相同的任务

WX20250527-181130@2x

WX20250527-181130@2x

实现上述框架,一个基础的版点击控制已经实现。在现实中跑的过程中发现一个问题:极个别的 DP Link 出现严重的点击超量。比如现实控制 5000 点击,但是实际点击却出现在 10000 左右。替换 DP Link 后,还有大量的点击上报。也就是点击上的滞后性

为了解决点击上报的滞后性,我们设计了一个等待队列。比如一个 DP Link 总点击限制在 5000,那么在点击数到达 500 时,就进行 DP Link 替换,将替换下来的 DP Link 放到等待队列中。这一段时间等待延迟的点击上报。如果后续达到了 5000,改 DP Link 直接放入完成队列,如果没有完成,继续下放该 DP Link。

等待队列

如下图:统计完毕后点击数后,有两个触发条件:

  1. 到达最大点击数

  2. 到达本轮的最大点击次数
    1. 在 DP Link 刚被替换上时,使用当前点击数 + 500,便是本轮最大的点击数

等待队列的设计:

  1. 等待队列是无重复数据的

  2. 等待队列是有界的,比如最多 20 条数据

  3. 当队列满时,循环使用队列中的数据。队列中的数据等待时间,队列中所有数据的使用时间

  4. 当队列满时,从队列中获取一条 DP Link(新),被替换下的 DP Link(旧) 如果没有达到最大限制,会将旧 DP Link 还给等待队列。

  5. 当队列不满时,需要从 未开始的 DP Link 池中获取新的 DP Link,将替换下来的旧 DP Link 放入等待队列,等待队列放满。

WX20250529-104010@2x

WX20250529-104010@2x

等待队列 未满时,新的 DP Link从 未开始队列中获取,替换下来的旧 DP Link,如果不满足最大点击数,放回 等待队列

WX20250603-194341@2x

WX20250603-194341@2x

等待队列 已满时,新的 DP Link从 等待队列 中获取,替换下来的旧 DP Link,如果不满足最大点击数,放回 等待队列

WX20250603-194735@2x

WX20250603-194735@2x

替换下来的旧 DP Link,如果满足最大点击数,放回 完成队列

WX20250603-194927@2x

WX20250603-194927@2x

未开始队列 队列空了之后,开始逐渐消耗 等待队列 中的 DP Link,直到消耗完毕。

WX20250603-195052@2x

WX20250603-195052@2x

下图是根据点击数替换 DP Link 的业务流程图:

WX20250603-101500@2x

WX20250603-101500@2x

http://www.lryc.cn/news/2398440.html

相关文章:

  • saveOrUpdate 有个缺点,不会把值赋值为null,解决办法
  • Java面试:企业协同SaaS中的技术挑战与解决方案
  • 【笔记】在 MSYS2 MINGW64 环境中降级 NumPy 2.2.6 到 2.2.4
  • 前端限流如何实现,如何防止服务器过载
  • 基于大模型的慢性硬脑膜下血肿预测与诊疗系统技术方案
  • vue入门环境搭建及demo运行
  • git checkout C1解释
  • 原始数据去哪找?分享15个免费官方网站
  • 宝塔部署 Vue + NestJS 全栈项目
  • # [特殊字符] Unity UI 性能优化终极指南 — LayoutGroup篇
  • Apache Iceberg 如何实现分布式 ACID 事务:深度解析大数据时代的可靠数据管理
  • 计算A图片所有颜色占B图片红色区域的百分比
  • 2024-2025-2-《移动机器人设计与实践》-复习资料-8……
  • 如何监测光伏系统中的电能质量问题?分布式光伏电能质量解决方案
  • 电子电路:全面深入了解晶振的定义、作用及应用
  • Day-15【选择与循环】选择结构-if语句
  • 定时器时钟来源可以从输入捕获引脚输入
  • SPL 轻量级多源混算实践 4 - 查询 MongoDB
  • 星敏感器:卫星姿态测量的“星空导航仪”
  • Cat.1与Cat.4区别及应用场景
  • 大宽带怎么做
  • Maestro CLI云端测试以及github cl,bitrise原生cl的测试流程
  • [内核开发手册] ARM汇编指令速查表
  • 25年宁德时代新能源科技SHL 测评语言理解数字推理Verify题库
  • AutoGenTestCase - 借助AI大模型生成测试用例
  • 区块链技术赋能供应链金融:重塑信任与效率
  • vue+cesium示例:3Dtiles三维模型高度调整(附源码下载)
  • 线程池RejectedExecutionException异常
  • lanqiaoOJ 1508:N皇后问题 ← dfs
  • 当 “欧洲版 Cursor” 遇上安全危机