前亚马逊工程师:广告系统架构解密
一、无处不在的广告
互联网广告的行业规模越来越大; 移动端的快速发展,给人们带来了更多的方便,广告产业比重越来越多; 广告模式越来越多; 互联网广告依托互联网媒介的发展,在各类平台广告的比重,有着正相关的影响。
广告业务发展了几十年,广告费用的结算方式也诞生了很多种,我们最常见的有以下几种:
CPT:按时间计费,独占性包时段包位置 CPM:按照每千次曝光计费 CPC:按照点击计费 CPA:按照行为计费(比如下载、注册等)
广告主先通过投放平台发布广告,可设置一系列的定向条件,比如投放城市、投放时间段、人群标签、出价等。
投放动作完成后,广告会被存放到广告库、同时进入索引库,以便能被广告检索引擎召回。
C端请求过来后,广告引擎会完成召回、算法策略、竞价排序等一系列的逻辑,最终筛选出Top N个广告,实现广告的千人千面。
用户点击广告后,会触发广告扣费流程,这时候平台才算真正获得收益。
1、高并发:广告引擎和C端流量对接,请求量大(平峰往往有上万QPS),要求实时响应,必须在几十毫秒内返回结果。
2、业务逻辑复杂:一次广告请求,涉及到多路召回、算法模型打分、竞价排序等复杂的业务流程,策略多,执行链路长。
3、稳定性要求高:广告系统直接跟收入挂钩,广告引擎以及计费平台等核心系统的稳定性要求很高,可用性至少要做到3个9。
4、大数据存储和计算:随业务发展,推广数量以及扣费订单数量很容易达到千万甚至上亿规模,另外收入报表的聚合维度多,单报表可能达到百亿级别的记录数。
5、账务的准确性:广告扣费属于金融性质的操作,需要做到不丢失、不重复,否则会损害某一方的利益。另外,如果收入数据不准确,还可能影响到业务决策。
下面着重介绍平台设计的几个关键点:
首先,整个扣费流程做了异步化处理,当收到实时扣费请求后,系统先将扣费时用到的信息缓存到Redis,然后发送MQ消息,这两步完成后扣费动作就算结束了。
这样做的好处是:能确保扣费接口的性能,同时利用MQ的可靠性投递和重试机制确保整个扣费流程的最终一致性。
为了提高可用性,针对Redis和MQ不可用的情况均采用了降级方案。Redis不可用时,切换到TiKV进行持久化;MQ投递失败时,改成线程池异步处理。
另外,每次有效点击都需要生成1条扣费订单,面临大数据量的存储问题。目前我们采用的是MySQL分库分表,后期会考虑使用HBase等分布式存储。另外,订单和账务系统之间的数据一致性,采用大数据平台做天级别的增量抽取,通过Hive任务完成对账和监控。
源数据层:对应各种源数据,包括HDFS中实时采集的前后端日志,增量或者全量同步的MySQL业务数据表。
数据仓库层:包含维度表和事实表,通常是对源数据进行清洗后的数据宽表,比如行为日志表、推广宽表、用户宽表等。
数据集市层:对数据进行轻粒度的汇总表,比如广告效果表、用户行为的全链路表、用户群分析表等。
数据应用层:上层应用场景直接使用的数据表,包括多维分析生成的各种收入报表、Spark任务产出的算法模型特征和画像数据等。
对于平台而讲,在确定需求后,首先需要明确自己的发展模式,更具模式,确定系统,从而明确各个系统的功能、协同性、以及各个系统的压力点。进行倒推,确定平台系统的架构和技术方案。
好的系统架构,需要以系统的可用性为基础,进行系统升级和拓展。
对于互联网广告业务来讲:好的产品往往带来革命性的变革,这个社会缺乏沉淀和创意。优秀的产品思路决定着广告行业的风向。
小问题:百度为何衰落的呢?是电商的冲击还是微信的崛起呢?
作者介绍:前亚马逊工程师,现58转转技术总监。持续分享疑难技术点、复杂系统架构、团队管理方法,希望为你的职场进阶带来新思路,欢迎扫码关注!
加入技术琐话读者群讨论,请在公众号回复关键词:读者群。
技术琐话