广告业务系统 之 承前启后 —— “消息中心”

news2025/1/20 19:59:20

文章目录

    • 广告业务系统 之 承前启后 —— “消息中心”
      • 消息中心
        • 物料同步链路图
        • 模块设计之 “一分为二”
        • 模块交互图之 “强一致性设计”
          • 奇怪交互图的数据链路
          • 数据一致性问题
      • 日志中心

广告业务系统 之 承前启后 —— “消息中心”

消息中心

消息中心,是为 投放引擎 做客户信息及素材同步的环节,与 bp 平台、结算侧、投放引擎 进行数据实时交互,是 链路中承前启后的重要环节。
欢迎关注文末公众号

物料同步链路图

物料由 DSP 发起,至 Message_center ,为 投放引擎 提供候选支撑。
在这里插入图片描述

广告主[后续以DSP代称],通过 BP 平台,将自身的资质信息、标识信息、及投放的免审素材 等其他信息进行上传,BP 平台自身进行落地并进行审核,存在信息未通过审核、通过、下线、上线、暂停 等状态。

  • 其中 Dsp 信息将会与 Client 信息进行耦合,作为表示当前素材的 UUID,会随流量进入到曝光日志中,最终流转至结算侧,而结算侧将以此为依据作为计量,估算订单/合同到量的主要判定条件。
  • 广告素材包含两种,送审和免审。
    • 免审素材包含两种类型,打底和非打底。打底素材即兜底素材,当 DSP 无相关素材返回时,进行兜底使用。非打底素材将随具体的投放计划进行曝光展示。

送审素材会随业务自然结果进行统一审核,故不在此链路。

  • 场景投放信息,这里是把具体的投放场景按类型分隔为多个场景。比如,同城流、feed流、落地页等等。DSP 需要圈定,自身业务对应的用户群体所在的场景,有针对性的投放广告。

欢迎关注文末公众号

模块设计之 “一分为二”

看到这里,感兴趣的同学可能会发现,一个问题。

“消息中心的数据全都是从 BP 平台来的,为什么把数据流一分为二?”

这里解释一下原因,看看 “一分为二” 有哪些妙处,是否和你想的一致。

  • 数据使用方不同
    • BP 平台,使用方为 DSP。对外提供服务,需要存在外网域名、签名校验、等专属逻辑功能。
    • 消息中心,使用方为 投放引擎。只对内服务提供数据支撑。
  • 数据使用细节不同
    • BP 平台,数据包含多个维度,多个类型。包含未审核、审核、暂停、新建、变更 等等状态及 Dsp 身份校验、历史操作记录等数据。
    • 消息中心,数据仅需要为全部审核通过且当前可用、投放中的素材、Dsp、Client 等数据,状态单一,规模极小。
  • 数据使用性能要求不同
    • BP 平台,toB 类型,无过硬性能要求。
    • 消息中心,承接实时流量,对数据读取性能要求极高。
  • 模块功能专一性

通过上面一通的分析,再加上你对微服务外延的理解,回到上面的问题。相信你已经得到了对应的答案!

欢迎关注文末公众号

模块交互图之 “强一致性设计”

Message_center 上游是 BP 平台,下面是两模块交互流图。
在这里插入图片描述

这样的交互图,乍一看比较奇怪。

“不是简单的上下游数据同步嘛,直接进行 Http/Https 接口调用不就行了嘛,好多业务上下游都是这样做的…”

当结合整个背景仔细思考后,你就会觉得上面的发言差点意思!

先介绍 上面交互图中的数据链路。

奇怪交互图的数据链路

数据源是 BP ,数据直接走中间件【kafka】进行生产落地;下游的 Message_center 模块通过消费中间价的形式获取数据。

> 注意:这里传递的数据为 命令形式【雷同于设计模式中的——命令模式】。

{
    "type":"dsp",
    "action":"update_all",
    "env":"test",
    "source":"bp",
    "version":2,
    "time":"2021-08-18 11:33:06"
}

Message_center 获取到命令数据后,通过 API 接口的形式,访问 BP 数据库,拉取符合命令规则的数据后,进行落地。

注意:BP 侧落地为 DB,Message_center 为读性能更优、承载量更大的 Redis/MC 组件。

数据一致性问题

假如,我们使用 Http/Https 接口形式进行上下游交互。一个问题,我们不可避免:就是网络问题。

网络对于通信来讲,是完全不可信的,要不然 TCP 协议里也不会花大部分精力处理数据包次序及重传等涉及数据完整性的策略。

  • 数据包丢失 和 数据包乱序 是我们首要考虑的问题。
    在怪异的交互图中,我们采用 API 拉 DB 数据的方式,有效避免此类问题。
  • 数据命令发送后,与 DB 数据更新的 时间 Gap 问题。
    当接受到命令并同步 DB 数据后,此时 BP 侧 DB 才完成数据变更,意味着前次同步数据为旧数据。对比,Message_center 持有 cron 任务,定期刮擦 DB 数据,进行同步。

上述问题解决了,但细心的同学可能会发现,更多的是图中右侧的链路,左侧 kafka 相关无涉及。

那么,“命令触达的方式是不是可以用 Http/Https 方式替代呢?“

  • 为何使用中间件支持 命令触发呢?
    不错,是可以使用 API 功能性替代的。唯一的不足是,kafka 数据完整性更高,消息落地更可靠。不过从何说起呢?
    • 了解 中间件 的同学可能知道这个点。
      就是 在消费数据时,可以手动提交 offset。这个设置可保障 Message_center 在拿到数据后,业务处理异常可在此重新消费同一条数据,避免数据未同步的问题。如果是 API ,收到的响应仍是 200,无法发现此类问题。

奇奇怪怪的设计,从来不是画蛇添足,只是为系统安全、高效、稳定运行而护航!

欢迎关注文末公众号

日志中心

日志中心,是广告链路中数据的中转站。实时监控全链路服务健壮性、及支撑 结算、曝光、互动 等监测上报。在后链路中发挥着举足轻重的作用…


见后续文章!


推荐阅读:
三行代码搞定 —— 反转链表…
Kafka 高吞吐、高性能核心技术及最佳应用场景…
HTTPS 如何保证数据传输安全 —— TLS 协议…
五分钟搭建基于 Prometheus + Grafana 实时监控系统…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

韩顺平老师的Linux基础学习笔记 (上)

Linux学习笔记 前言:本系列笔记的参考由 2021韩顺平 一周学会Linux 总结而成,希望能给学习Linux的同学一些帮助。也感谢韩老师录制的视频给我带来了非常巨大的收获! 目录: 韩顺平老师的Linux基础学习笔记 (上)韩顺平老师的Linu…

交通部互通互联二维码之发卡机构公钥证书

背景 随话说的好啊,好比不如烂笔头,之前开发联调OK后,闲置了半年,结果今天再去搞公钥,发现完全忘记了生成规则。审核 有病 哪里来的广告? 特此,记录一下我们的过程,以便后面再出现…

gitee的ssh配置

#1.配置自己的gitee郵箱,返回直接輸入郵箱 ssh-keygen -t rsa -C "郵箱" #2.複製郵箱的ssh秘鑰 cat ~/.ssh/id_rsa.pub #在個人配置添加自己的ssh秘鑰

【jQuery】常用API——jQuery样式

jQuery 给我们封装了很多动画效果,最为常见的如下:一、显示隐藏切换效果1. 显示语法规范 show([speed,[easing],[fn]]);显示参数:(1)参数都可以省略, 无动画直接显示。(2)speed&…

(十五)一篇文章搞懂Java的内部类

目录 1.概述: 2.内部类之一:静态内部类 3.内部类之二:成员内部类 4.内部类之三:局部内部类 5.内部类之四:匿名内部类 1.概述: 内部类就是定义在一个类里面的类,里面的类可以理解成(寄生)。 2.内部类的使用场景、作用: ①当一个事务的内部,还…

前端如何上传图片文件

效果图html代码js效果图 效果: 这篇博客必须要后台调用你的js函数,如果后台不打算调用你的js函数可以放弃此篇博客了,或者自己将代码改良。如果后台接受该代码可以参考这篇文章:(如果后台不是使用php,也没关系只要返…

.net工作流引擎ccflow集成并增加自定义功能

一、为什么需要自定义扩展1、第三方类库已满足大部分需求,剩下的根据具体业务需求抽象成公共功能进行扩展2、第三方呈现的web页面与原类库耦合度较高,希望在原页面上扩展而不影响原来的功能3、在完全不修改第三方类库及web页面的情况下,加入自…

【数据结构】堆

堆 堆的定义 (最大)堆是一个可以被看成一棵树的数组对象,满足如下性质: 堆中的父亲结点总大于或等于其左右孩子结点的值总是一棵完全二叉树 完全二叉树 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点…

1.1.1半导体基础知识

半导体基础知识 上学的时候大概是模电第一节就会讲完这,会详细的介绍什么是导体,绝缘体,半导体,本征半导体,然后接着详细的讲述本征半导体的结构,两种载流子,P,N杂质半导体,PN结以及…

Spring Boot自动配置--如何切换内置Web服务器

系列文章目录 Spring Boot[概述、功能、快速入门]_心态还需努力呀的博客-CSDN博客 Spring Boot读取配置文件内容的三种方式_心态还需努力呀的博客-CSDN博客 Spring Boot整合Junit_心态还需努力呀的博客-CSDN博客 该系列文章持续更新中~ 目录 系列文章目录 前言 一、默认…

【Python】python深拷贝和浅拷贝(二)

【Python】python深拷贝和浅拷贝(二) 前言 上一期我们介绍了Python中深拷贝和浅拷贝的定义以及它们在执行过程中内存结构,同时也给出了深拷贝和浅拷贝的方法。(没有看上一期的朋友看这里,python深拷贝和浅拷贝&#…

架构设计---性能设计的详解

前言: 系统性能是互联网应用最核心的非功能性架构目标,系统因为高并发访问引起的首要问题就是性能的问题,高并发访问的情况下,系统因为资源不足,处理每个请求的时间都会变慢,看起来就是性能的变差。 因此…

什么是随机森林?

什么是随机森林? 随机森林是一种有监督的机器学习算法。由于其准确性,简单性和灵活性,它已成为最常用的一种算法。事实上,它可以用于分类和回归任务,再加上其非线性特性,使其能够高度适应各种数据和情况。 …

JavaSE初阶篇:系统环境变量path|classpath|JAVA_HOME

环境变量是为了 “在命令行窗口下”编译和运行Java程序而配置一、系统变量:Pathpath环境变量作用:将命令所在的路径配置到path中去,就相当于在计算机中“注册”了一样,以后找这个命令,会直接去你配置的路径下寻找。达到…

Revit中怎么使两面墙拉近时不自动连接?柱断梁墙功能

一、Revit中怎么使两面墙拉近时不自动连接? 问题:同材质的墙体在同一条直线上只要将其端点拖拽至一起就会融合成一道整墙体(如图-1、2所示),但是在做一些较特殊的结构时我们不需要其连接成一道整墙,有没有什么办法能够设置呢? 我们可以通过…

避免Mysql插入重复数据的几种方法

1、前言 在平时对数据库操作时,有时候需要向数据库中插入一些数据,此时就需要使用数据库的插入语句,但是在向数据中库插入数据时,不能盲目插入,因为盲目的插入可能会造成数据重复,浪费数据库的资源&#x…

Pytest三种配置文件

😎😎原文出自:测个der,博主的公众号,格式美观一些。 配置介绍 pytest 的主配置文件,可以改变 pytest 的默认行为,执行 pytest -h,这里有很多配置均可用于 pytest.ini配置 (venv) …

HarmonyOS鸿蒙学习笔记(16)Canvas入门使用

Canvas入门指南1、Canvas代码结构2、简单案例2.1 fillStyle和fillRect 绘制蓝色矩形2.2 strokeRect和strokeStyle 绘制红色边框2.3 lineCap的使用2.4 lineJoin的使用2.5 closePath的使用3、参考资料1、Canvas代码结构 在使用Canvas的时候,需要向初始化RenderingCon…

第四十七讲:IPv6基础知识

一、IPv6网络元素及概念 IPv6的网络元素如下图所示。 节点:任何运行IPv6的设备,包括路由器和主机(甚至还将包括PDA、冰箱、电视等)。邻节点:连接到同一链路上的节点。这是一个非常重要的概念,因为IPv6的邻…

JS面试题--this指向+面试题

this其他补充 内置函数的绑定思考 01_一些函数的this分析 // 1.setTimeout原理 // function hySetTimeout(fn, duration) { // fn.call(window) // }// hySetTimeout(function() { // console.log(this) // window // }, 3000)// setTimeout(function() { // console.l…