代銷是 vivo 商城已經落地的成熟業務,本文提供給各位讀者 vivo 商城代銷業務中兩個異構系統業務融合的對接經驗和架構思路。html
近兩年,內銷商城業務的發展十分迅速,vivo 商城系統的架構也完成了從單體往分佈式的演進。咱們在 vivo 商城服務化方向作了不少的努力,基礎服務的能力逐漸沉澱下來。安全
2019年咱們也開始在產品功能上玩起了多元化的營銷業務。目前手機品類還是咱們銷售的主力,可是非手機品類的sku單品數量仍是不多,巧婦難爲無米之炊。架構
爲了解決非手機品類商品豐富度問題,運營考慮和電商平臺進行合做,但願用代銷的方式爲商城擴充更多的非手機類商品品類。框架
先跟你們解釋下「採銷」和「代銷」的區別,簡單來說就是一個貨權歸屬的問題,採銷是買貨到咱們倉庫進行售賣,可自由訂價;代銷是貨權歸屬於平臺方,也就是貨還放在對方的倉庫,用「以銷定採」的方式進行售賣,有利潤空間,可是自主訂價受限。異步
因此代銷業務一開始就帶着明確的目標出發了,咱們但願經過接入其餘的電商平臺可以作到如下幾點:分佈式
一開始選擇了幾個平臺方,爲了提高選擇效率,咱們先對平臺方定了幾個重要的參考指標,目的是要能過濾存在對接風險的平臺。ide
對接參考指標:模塊化
可是參考指標只能做爲一個篩選器排除不能對接的。剩下的平臺方,須要咱們從技術和產品的角度進行深度的調研分析,預研期間也主動和各個平臺方電話溝通了幾回,最終咱們挑了一個各個方面都比較合適的候選人「網易嚴選」。測試
此次對接任務是經過對方提供的API接口,把他們的商品同步過來在咱們商城進行售賣。網站
咱們要求的是商城能正常地展現,用戶能正常的下單並支付,同時支持逆向的用戶取消訂單,退款退貨等等。
可是外部系統的對接存在不少的風險,尤爲是非公司的第三方異構系統,並且對接的是包含商品、訂單的全流程,咱們要面對不少的挑戰。
爲了保證全流程完整接入的可控,咱們先和對方溝通了測試環境配置,嘗試調通他們的接口。
緊接着咱們開發人員分紅了兩批,一批嘗試經過手工組裝字段把對方商品接入vivo商城,一批預研訂單正逆向的全流程,此次咱們嘗試接入的目的很明確「打通全流程」。
最終經過使用 Demo 拉取對方報文,手工組裝數據,快速試錯,實驗結果和前期預研的同樣,經過實踐證實全流程確實可行,鏈路能打通!實驗結果讓你們信心大增,也預示着咱們能夠整裝待發,正式踏上代銷系統的架構之路了。
在正式設計以前,咱們須要對新系統有點暢想,由於咱們不只僅只是完成此次對接的任務,咱們更但願它擁有更抽象的業務功能,具有必定的擴展能力。
架構代銷平臺的意義:
咱們把系統簡單地歸類,劃分紅了三部分,從左往右分別是平臺方 → 代銷平臺 → 商城內部系統。
代銷系統總體的設計的思路有點相似API網關,但在細節方面又有不少不一樣,代銷系統的設計仍是總體偏業務實現,也提供了額外的平臺方信息的查詢服務供內部系統調用。
對咱們來講是個黑盒,他們的系統設計、數據交互咱們是沒法得知的,不過若是仔細研讀文檔的話,也能從他們提供的API中窺探一二,可是相比於對方的設計咱們更須要把精力花在和他們的溝通和環境聯調上。
是此次設計的重點,它承接着外部和內部系統,是系統交互的重要紐帶。目前擺在咱們面前的仍是一張白紙,咱們須要先梳理下全部的基礎功能,把它的框架先搭建出來。
爲此,咱們制定了簡單的設計原則「無侵入,對內屏蔽掉底層適配的細節,關注服務自己,並具有必定的業務抽象和擴展能力」。而後在此設計原則基礎上咱們作以下比較精心的設計:
模塊化設計
對接嚴選以後,再對接其它平臺方的話。咱們但願各個平臺分紅模塊化進行對接。保證各接入方之間業務徹底隔離,互不侵入。
可以作到可插拔,如遇到合做終止的狀況,能以最小的成本關閉對接通道。
路由層
適配層
服務暴露
統一回調
統一配置
橫向能力
【高可用】
以前對外提供的都是高QPS的只讀Dubbo接口,此次要開Dubbo寫接口提供給代銷系統來建立商品。
瞭解接口設計的小夥伴都比較瞭解,寫接口最主要的是保證事務的同時要能作到防刷防重。爲此咱們在寫接口上加了統一驗籤(內部系統弱校驗)和接口冪等性設計。
【接口設計】
你們平時在瀏覽電商網站的時候,商詳頁呈現出來的內容是十分豐富的,這也間接說明了商品的模型自己仍是比較複雜的,因此在設計商品寫接口的時候,開發內部產生了爭論,討論出了兩個方案。
方案一:部分開發認爲應該按如今的商品模型,把接口打散,代銷平臺對接多個寫接口,好處是局部更新比較方便,也避免一次性提交一個大事務;
方案二:另外一波同窗認爲就應該是一個接口,不然會出現接口散亂、亂序的狀況。
最終咱們仍是採納一次性提交的方案二,雖然會有大事務的風險,可是能夠經過代碼層面來緩解,並且架構設計自己就是一種權衡,設計接口的時候仍是要多站在調用方的角度,對方確定不會但願服務方的接口是散亂、無序的,這會增長調用和維護的成本。
【正逆向的流程】
訂單的難題最主要仍是雙方流程的融合,因此咱們針對代銷邏輯作了部分的流程改造。
這邊只給你們舉一個下單的例子,嚴選提供的建立訂單API實際上包含的是下單+支付兩個動做,爲了適配他們的流程,咱們作了點改造。
當用戶在商城下完訂單以後,代銷系統僅對接嚴選作庫存和配送區域的校驗,確保訂單能下成功。等用戶在商城側支付完成後,代銷再次發起建立訂單的請求給到嚴選。若是遇到建立異常(從數據上看不多幾乎沒有),咱們也會有自動的取消流程。
上面的設計肯定了各個模塊的功能,劃分了業務的邊界,讓咱們看清了總體的骨架和脈絡。可是咱們還須要畫一張切實可行的調用關係圖,讓整塊邏輯立體豐滿起來,最終讓每一個開發都知道此次網易嚴選該怎麼去對接。
代銷商品覆蓋了官網商城列表頁、活動頻道頁、選購頁,展現效果以下:
咱們在前期也遇到有些品類比較好的平臺方,可是因爲技術緣由沒法和咱們系統完成對接,也挺遺憾的。將來咱們但願代銷平臺也能本身制定一套API標準,對方按照咱們的標準,本身開發接口把數據傳給咱們就好了,這樣就少了不少溝通和接入的成本。
做者:vivo官網商城開發團隊