作者:閑魚技術-劍辛
一、面臨問題
在閑魚生态裡,使用者之間會有很多種關系。其中大部分關系是由買家觸發,聯系到賣家,比如買家通過搜尋、收藏、聊天等動作與賣家産生聯系;另外一部分是平台與使用者之間的關系。對這些關系分析之後我們發現這些關系中存在兩個問題:
-
使用者産生關系的層次不夠豐富;
現有系統隻維護了一部分使用者關系,包括收藏、點贊等,使用者關系的層次還不夠豐富。
-
使用者之間關系是單向且不夠實時;
在現有的玩法中,買家可以通過多種行為與賣家産生聯系,但賣家不能主動與買家發生關系和互動;而且平台計算的關系都是離線的,對使用者的吸引力不足。
上面提到的場景經過抽象歸納之後都是同一個範式:當某個條件被滿足之後,就會觸發相對應的動作。這個範式是IFTTT的基本理念,而閑魚IFTTT就是對這些問題的解決方案。
二、IFTTT概念
IFTTT是一個被稱為 “網絡自動化神器” 的創新型網際網路服務理念,它很實用而且概念很簡單。IFTTT全稱是 If this then that ,意思是如果滿足“this”條件,則觸發執行“that”動作。IFTTT由三部分構成,分别為Trigger、Action和Recipe。

可以看出IFTTT本身概念并不複雜,它的真正魔力在于“由簡單組成的複雜”,也就是由衆多簡單的IFTTT流程互相銜接成跨越整個網際網路、跨越多平台、跨越多裝置的狀态機。
2.1、閑魚IFTTT
閑魚IFTTT是基于閑魚的業務場景與IFTTT理念結合後産生的,提供IFTTT标準協定封裝,對業務無侵入可擴充的服務編排系統。
閑魚IFTTT的兩個特性對應上述兩個問題,分别是:
- 多元使用者關系感覺
多元指的是覆寫面,閑魚IFTTT通過更多元度的挖掘,抽象并維護了更豐富的使用者關系。基于使用者關系資料,我們可以産出使用者畫像,并通過更有效的方式觸達使用者。
- 實時使用者雙向互動
閑魚IFTTT底層具有對使用者關系大資料的高效存儲和處理能力,以支援上層業務中使用者關系實時處理;閑魚IFTTT不僅支援買家到賣家關系,而且通過設計天生支援賣家到買家關系。
閑魚IFTTT把之前平台與使用者的互動、買家到賣家的聯系,切換稱閑魚使用者之間天然的關系互動,對使用者騷擾更少且激活拉回的效果更好,我們基于這個場景設計閑魚IFTTT的技術方案。
三、技術方案
首先按照IFTTT規範對業務進行模組化,分為Channel、Trigger和Action層,其中Channel層是資料底層,将Trigger和Action關聯後組成标準Recipe。
-
Channel
Channel層在閑魚IFTTT的作用是儲存和管理使用者關系資料,Channel層定義了使用者關系的中繼資料結構,包括關系類型、源賬戶和目标賬戶。Channel層是閑魚IFTTT的基石,Trigger和Action均基于使用者關系資料進一步抽象業務邏輯。
-
Trigger
Trigger是業務上自定義的觸發事件,與業務息息相關,可能是關注的人上新、浏覽寶貝降價或者是參加的百币奪寶活動開獎等。當Trigger觸發後,閑魚IFTTT會根據Trigger類型和配置的關系類型計算使用者名單,并調用Action層進行處理。
-
Action
Action層處理對象是Trigger觸發後計算的使用者名單,可以給名單裡的使用者發Push,發權益或者其他定制邏輯。Action本身是标準化、可插拔的元件,業務上可以利用Action元件對使用者名單做AB測試,快速實驗不同Action政策。
接下來我們說一下閑魚IFTTT詳細技術方案,方案如下:
整體技術方案按照業務模組化的結構圖細化,補充依賴的技術元件。整體流程不再細述,針對流程中重點子產品詳細說明。
3.1、場景快速接入
設計場景快速接入的目的是讓業務對接入閑魚IFTTT無感覺,因為在最開始的設計中,場景接入是準備通過在業務邏輯裡增加AOP切面,将業務資料和場景上報。但因為這種方式對業務本身有一定侵入,增加業務執行的RT而且不夠靈活,最終被否決。
而現在的場景快速接入方案解決了這些問題,通過SLS接入所有應用的海量網絡請求日志,記錄請求的URL、參數和響應;将SLS作為Blink流計算任務的資料源;根據diamond動态下發的規則實時篩選網絡請求URL和參數,把資料按照指定格式組裝後上報給Channel層。
場景快速接入方案将業務邏輯與場景接入解耦,支援快速接入,靈活變更且延遲低,是針對大資料場景接入的高性能解決方案。
3.2、計算使用者名單
計算使用者名單子產品采用責任鍊模式設計,因為在不同Trigger場景中,業務對使用者名單的計算和篩選邏輯都是不同的。通過責任鍊模式,将主流程與業務篩選邏輯解耦,并支援各業務靈活定制篩選邏輯,互不幹擾。
3.3、PushAction
Action層是閑魚IFTTT中最重要的一環,會直接觸達到使用者,Action的邏輯會直接影響使用者對平台的直覺感受和活躍率。消息Push是Action中最常見的邏輯,更要防止使用者被騷擾,PushAction邏輯如下:
- 敏感人群過濾;
- 疲勞度校驗;
- 對發送人群進行AB實驗;
- 組裝消息;
- 将Action各節點日志同步到SLS,友善檢索和排查問題;
- 統計消息發送資料及點選資料,為業務後續決策提供依據;
3.3.1、疲勞度
疲勞度是防止使用者被騷擾的關鍵,我們針對疲勞度進行了分層設計,分為三層,第一層為使用者級别疲勞度,控制一個使用者在一個周期内收到消息數量;第二層是業務次元,控制使用者在一個周期内收到某個業務的消息數量;第三層是目标級别,控制使用者在一個周期内收到同一個發送者消息數量。
在業務次元層面,支援靈活控制多個業務聯合疲勞度,保證使用者不會被消息過度騷擾。
3.4、使用者關系存儲
使用者關系資料是閑魚IFTTT的基石,它的特點是存儲量級大,達到TB級别;而且對存儲和查詢的性能要求高,TPS和QPS的峰值都在一萬以上。經過調研,我們發現集團内部開發的Lindorm可以滿足需求。
Lindorm是阿裡内部基于Hbase自研的高性能KV存儲資料庫,對Hbase的性能和穩定性均有一定優化。閑魚IFTTT采用Lindorm作為使用者關系資料存儲,經性能測試驗證資料讀取QPS達到7萬,資料存儲TPS在10萬以上。Lindorm本身性能優異,為閑魚IFTTT高性能奠定基礎。
四、效果驗證
閑魚IFTTT自上線以來,已支援關注上新、浏覽寶貝降價和租房小區上新等多個業務場景,提供買賣雙方實時雙向互動能力,平均每天處理關系資料數億條,處理Trigger量達到上千萬,處理Action量達到億級别,消息點選率較離線push提高1倍以上。
閑魚IFTTT目前支援的是使用者互動場景,後續我們将結合閑魚自身業務特點,對IFTTT進行更高次元抽象,封裝标準Recipe接口,将閑魚IFTTT打造成提供流程編排、管理能力的服務平台。
在我看來,IFTTT從2010年推出以來,在國外有很大的熱度,在網際網路和物聯網領域都有專門的公司和團隊在研發,IFTTT的概念雖然簡單,卻通過标準化協定滿足使用者的強需求-讓各種網際網路産品為使用者服務。這其實也給我們網際網路從業者一些思考:在新機遇面前,究竟是快速投入比較重要還是抽象标準協定解決一類問題更加有效?
五、名詞注解
- SLS: https://cn.aliyun.com/product/sls
- Diamond:阿裡内部研發的持久配置管理中間件;
- Blink: https://data.aliyun.com/product/sc?spm=5176.10695662.1131226.1.bf495006EWuVAB
- MetaQ:阿裡内部研發的分布式、隊列模型的消息中間件;
- Lindorm:阿裡内部基于HBase研發的新一代分布式NoSQL資料庫,阿裡雲類似産品: https://www.aliyun.com/product/ots?spm=a2c4g.11174283.cwnn_jpze.59.2f5a15c3NH30me ;
- Tair:阿裡内部研發的高性能、分布式、可擴充、高可靠的Key-Value結構存儲系統;