摆脱8年技术债,Pinterest从头打造千亿营收时代的广告推荐系统

图片来源: 

Pinterest

充满假日氛围的2023年尾,Pinterest工程团队办公室却夹杂著一丝挥之不去的紧张。全新广告系统AdMixer要上演处女秀,负责一天高达20多亿次广告投放的推荐与呈现作业。

从复活节开始一路到新年的假日购物季,人们涌入Pinterest找寻送礼灵感,带来一年中最多流量,以及比前3季平均高出30%到210%,相当于多了2到3亿美元的广告收入。就算先前已经有在生产环境中试运作,AdMixer能否在这最繁忙且关键的季节独挑大梁,只有实际上阵才知道。

好不容易,熬过漫长的3个月,AdMixer通过了购物季流量考验,为Pinterest带来单季营收新高,并于接下来1年稳定发挥。2024假日购物季也没有灾情,使Pinterest迎来首次的单季破10亿美元广告营收。

业务规模快速成长,技术挑战显露

Pinterest是一个图片类的探索与社群媒体,根据使用者喜好和搜寻内容呈现一张张图片到看板上,每张图片都连结到图片介绍及外部网站,供使用者进一步探索。Pinterest的主要收入来源是广告,在图片看板中穿插图像型广告内容。

历年来,这些广告的形式除了标准广告图片,还发展出影片、轮播图、子母图、连结到电商的图,以及多页互动式图片等。近1、2年,他们还开始跟更多电商系统整合,强力发展购物广告及类似于RMN的广告。

支援广告业务多角化、规模化的关键IT建设是,Pinterest内部开发的广告推荐系统。这是他们公司内数一数二庞大和复杂的核心系统,负责从广告请求处理、检索候选、排序相关性,一路到竞价、投放等广告流程。

随著广告业务发展,Pinterest广告营收年年成长,2016年不到3亿美元,经过疫情高峰接连两年有5成左右惊人涨幅后,到了2021年,已经超过25.7亿美元。不过,如此高速的成长,也暴露出广告系统的设计缺陷,使工程团队面临一系列困境。

Pinterest初代广告系统Mohawk在2014年上线。截至2022年超过38万行程式码,同时执行200多项专案与实验,前端串联10多种用户端介面,后端更超过70个系统,投放广告给来自30多个国家、近5亿名活跃用户,每天展示超过20亿次广告。

Pinterest广告推荐系统是十分庞大且复杂的系统,负责接收广告请求、用户及广告特征值扩展、存取广告候选、排序并筛选推荐广告、广告竞价、回传广告等一系列流程,串联70多个后端系统及10多种前端介面。(图片来源/Pinterest)

这一切开发和维运,来自不同功能团队的100多工程师负责。随著业务规模增长,Pinterest想增加人力与系统规模,却碍于8年沉重的技术债与Mohawk设计缺陷,而陷入泥淖。

高龄8年叠床架屋,系统肥大又改动困难

Mohawk的系统基础建设与广告业务逻辑,耦合度过高。任何应用逻辑变更,都会涉及系统框架、资料库或云端服务设定的改动。雪上加霜的是,Mohawk系统还缺乏适当的模组化与所有权分离设计。本应属于不同模组的功能或函式,常被混在相同的目录或档案之中。

这使系统模组间牵一发而动全身,连许多看似简单的作业,都需要深入了解多个功能模组的基础建设特性,并取得这些模组与背后基础建设的存取和改动授权,大幅增加作业复杂性。

不只如此,这种过度耦合的系统架构,使系统存在许多错误。加上程式码所有权不明,系统异常时,难以找到单一负责工程师或团队来解决。工程师日常修改程式码时,更常常产生意料之外的冲突。

不但出错时难以找到单一负责人来修复系统,即使想翻阅系统纪录来厘清责任归属,都未必可行。

这是因为,Mohawk的系统框架无法设置有效的机制来维护数据完整性。当功能存取错误数据,或数据意外遭到更改,系统都无法自动修正或警告工程师。偏偏,系统模组间又高度耦合,一旦程式码出错,容易导致许多相关模组的数据与系统纪录都不可靠。

更加可怕的是,所有工程师都有权限采用多执行绪的方式来设计功能模组,来提升自己功能模组的处理效能。可是,Mohawk没有设置执行绪安全机制,来因应程式间相互竞争系统资源,及多执行绪的数据存取模式不符预期等异常情况。

这可能导致,当软体速度被资源竞争拖累时,难以检测出原因。或者,当执行绪A需要存取特定栏位数据,数据却已经被另一条执行绪B修改过,使执行绪A拿到预期外的资料,且无法检查。

这一连串系统限制与缺陷,使Mohawk系统拥肿、缺乏修改弹性、容易出错,又难以除错。甚至,许多系统错误来自执行逻辑或系统设计层级的缺陷,而非程式码错误,所以不能透过单元测试或整合测试,来发现真正问题所在。要修复这些问题,会牵涉太多模组与系统底层设计,使Pinterest工程团队难以下手。

光是持续在Mohawk上开发和维运,就已经日益艰难,遑论增加人手和扩展系统,来支援大幅成长的业务规模。于是,2021年底,Pinterest决定重建广告推荐系统,展开为期3个月的事前评估、测试及使用者访谈。最后,决定从头建置一套新的广告推荐系统AdMixer。

以Mohawk为前车之鉴,费时两年从头建置新广告系统

Pinterest工程团队决定,不以Mohawk程式码为基础进行大改版,而是从头写一套新系统。

这是因为,改版原始系统,需要极度谨慎的将程式码细致拆分、慢慢改写,每一项部署变更都需要数天到数周的严格实验。他们认为,从头重写一个独立的新系统,再与旧系统A/B测试,开发效率反而更高。他们打算以Java语言重写广告推荐系统,采用与另一套内容推荐系统同样的开发语言,以保留未来进一步整合两大推荐系统的可能性。

Pinterest期待,新系统AdMixer必须支援未来至少5年业务成长。新系统要可规模化,让数百名开发人员能够快速开发新产品和演算法,以跟上甚至推动业务增长。并且,要有更严谨的系统设计,以确保高服务稳定性和高数据完整性。

以Mohawk为前车之鉴,Pinterest设定出四大设计原则,易于扩展、明确划分系统边界、顾及数据与执行绪安全性,以及利于高效开发,来确保AdMixer不再重蹈覆辙。

根据这四大设计原则,他们打造出一套程式码组织框架Apex,来管理功能模组间的耦合关系。搭配资料模型,规定数据在模组间传递的规则,以维护执行绪和数据安全。

写完新系统后,他们采取多阶段验证做法,细致切分工作流程,预先针对验证和转换挑战规画做法,确保每一步骤都先做好充分准备,才进入影响范围更大的下一步骤。这种做法,使他们能快速验证AdMixer指标达标,并降低新旧广告系统并行时间,同时压低成本与确保系统稳定性。

历经2年,Pinterest终于在2023年底正式上线AdMixer。新旧系统转换过程中,广告业务没有中断,AdMixer上线后也未曾出现灾情。

这一年间,于广告系统上开发维运的工程师人数,从100多名增加到超过280名,且超过90%工程师都对开发体验满意。他们更已经在新系统中推出多个新功能,包括与Google Ads整合广告投放管道等重要专案。他们还藉著这次重写,将广告系统部署于更高效的云端环境中,使每年基础设施成本减少数百万美元。

疫后,Pinterest的广告营收仍每年创新高,2024年已经超过36.4亿美元。接下来我们将介绍,Pinterest工程团队两年间,如何设计、验证与转换新广告推荐系统,以支援快速成长的广告业务。(请见:Pinterest如何设计新广告推荐系统,来有效模组化数十万行程式码广告推荐系统上线前,Pinterest如何用广告投放实战验收