从零到一推演一个广告系统架构
背景
我们在日常工作的过程中,或多或少都会需要去理解一个系统的架构,理解了系统架构之后,对于自己接触的需求,就能够有更深刻的认识。
最近我接手了一些广告相关的测试工作,本文就以一个广告系统的架构作为抛砖引玉,任何系统架构都可以按照这个思路去做。
思路
首先必须要明确的是,所有架构都不是设计出来的,而是根据实际的业务场景演进出来的。
明确了这个结论之后我们就可以根据这个结论对系统架构进行推演。推演的原则有两点:
- 根据实际业务场景,抽象最原始的架构
- 假想业务指标,推演架构变化。
接下来我会按照这两个原则,推导一个广告系统的架构变化的过程。
推导过程
抽象最原始的架构
广告系统的实际业务是怎么样的呢?其实是非常简单的,广告主投放广告,用户看广告。
所以广告最初的模型就是一个投放链路,一个拉取链路。
注意: 所有广告都会有扣费系统,这里如果加入的话会导致架构过于复杂,并且关注点分散,所以本文暂时不讨论扣费相关的链路。
这个架构甚至不需要有计算机功底,都能很好的理解这个架构。
业务指标——看广告的人越来越多
假设我们的广告系统上线了,同时也假设现在系统只有一条广告。 看广告的人越来越多了,那么上面的原始架构就需要进行一些优化了。
标红的地方就是新增的内容,如果每次都实时的去读取DB,那么DB的压力就会非常大,所以在这种情况下,我们引入缓存的机制,在投放把数据写入DB的同时,写入缓存,让拉取服务去缓存读广告数据,而不是直接查数据库。
业务指标——投广告的人越来越多
看广告的人越来越多了,给广告主带来收益了,这时广告主就开始增加了,那么现在就不止一条广告了,因此架构要做进一步的改变。
这时我们引入了一个同步服务,有广告主投放广告了之后,通过这个同步服务把广告同步到缓存中。也有广告主没钱投广告了,要把广告下掉,同步服务也可以把下掉的广告从缓存中删掉。
同步服务保证了广告数据最终的一致性。
业务指标——多广告同时存在,广告竞价
随着广告越来越多,那么就会有一个问题,这么多广告,我要把哪一条广告展示给用户看呢?
此时我们的拉取服务已经不仅仅是一个通道了,还包含了广告挑选的服务,那么多广告都要展示,那么作为广告系统来说,肯定是价高者得。
所以拉取服务增加了广告拣选的能力,哪个广告出的钱多,哪个广告就给用户看,也就是我们很熟悉的竞价排名。
业务指标——千人千面
上面介绍的广告系统,能达到的效果是一个固定广告,这种效果明显不是特别理想。
例如奶粉广告,肯定希望准妈妈或者新手妈妈看到,而汽车房地产广告,肯定希望推送给有一定经济能力的人群。
千人千面的场景也就应运而生了,千人千面也是互联网广告与传统广告一个非常显著的差异。
要做到千人千面,那么很显然,在拉取广告的时候需要有一个用户画像的服务来查询当前用户的一些特征,例如性别,常住地,兴趣爱好等等信息。
在广告拣选的时候,价格不再是唯一的出广告的因素了,用户的特征也是影响是否出广告的因素之一。还是上面的例子,如果给一个准妈妈或者新手妈妈推荐广告,那么奶粉广告一定比西装广告更适合,即使西装的广告出价更高,从广告转换的角度来看,奶粉广告明显更适合。
注意: 这里投放广告的广告主肯定需要在投放的时候选择人群定向,本文没有写这块的演进,是希望读者聚焦拉取链路的演进。
业务指标——多渠道展示广告
我们的内容方有很多,广告展示的方式也是多种多样。不同的渠道需要的广告也都不相同,例如视频类的,电商类的等等。每个类型的广告可能会有一些个性化的要求,因此单一的拉取服务,已经不能满足需求了。
我们在拉取服务之前加入不同类型的接入服务,他们从拉取服务获取广告之后,可以根据自身的业务特性做一些特殊的逻辑,满足不同渠道的个性化需求。
业务指标——巨量广告
我们的广告系统越来越强大,越来越多的广告主青睐在我们的系统投放广告。当广告过百万甚至千万时,实时的对这么巨量的广告进行计算时,服务端压力会比较大,为了减轻单一服务的巨大压力,我们可以把拣选广告的动作做一些拆分,模仿类似漏斗的方式,以便降低单一服务的计算压力。
我们把广告从缓存到最终展现给用户的过程分成了3个阶段。
第一个阶段,根据用户画像,把用户可能感兴趣的广告都拉回来。这个阶段过滤了与用户无关的广告,量级可以从千万缩小到几十万。
第二个阶段,把这些返回的广告进行计算打分。这个阶段过滤了很多劣质的广告,确保返回的广告都是一些比较高质量的广告,量级可以从几十万缩小到千以内。
第三个阶段,再对上一个阶段返回的优秀广告做更深度的计算打分,最终返回一条最优的广告。
业务指标——实验系统
随着广告越来越多,我们为了广告的效果,也需要做一些实验,比如同样的广告,但是不同的展示方式,转换的效果可能会有差异。
这里引入了实验系统,在拉取广告的时候,按照一定的要求给广告打上实验标记,虽然是同一个广告,但是最终用户拉到的可能就是两种形态,通过转化统计分析,就能知道哪种样式的效果更好。
总结
本文只是按照一些常规的指标,对拉取广告的架构做了一些推演,其他的链路甚至其他业务的架构推演也可以参考这种思路进行推导。
这样推导出来的架构,可以认为是一个模型,真实的系统架构肯定会比推演出来的架构复杂的多,但是通过这个模型再去比对自己现在接手系统的架构,可以更好的帮助你理解先有的系统架构。