圖片來源: 

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如何用廣告投放實戰驗收

熱門新聞

Advertisement