掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
今天很榮幸給大家介紹 58 速運(yùn)從艱苦創(chuàng)業(yè)到成為同城貨運(yùn)行業(yè)領(lǐng)頭人的整個(gè)系統(tǒng)演進(jìn)過程。

為企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站優(yōu)化、營銷型網(wǎng)站、競價(jià)托管、品牌運(yùn)營等營銷獲客服務(wù)。成都創(chuàng)新互聯(lián)擁有網(wǎng)絡(luò)營銷運(yùn)營團(tuán)隊(duì),以豐富的互聯(lián)網(wǎng)營銷經(jīng)驗(yàn)助力企業(yè)精準(zhǔn)獲客,真正落地解決中小企業(yè)營銷獲客難題,做到“讓獲客更簡單”。自創(chuàng)立至今,成功用技術(shù)實(shí)力解決了企業(yè)“網(wǎng)站建設(shè)、網(wǎng)絡(luò)品牌塑造、網(wǎng)絡(luò)營銷”三大難題,同時(shí)降低了營銷成本,提高了有效客戶轉(zhuǎn)化率,獲得了眾多企業(yè)客戶的高度認(rèn)可!
簡單來說我們的業(yè)務(wù)是做同城貨運(yùn),比如您去買一個(gè)大型家具,自己的家用車肯定是裝不下的,這時(shí)你可能需要找路邊的小型面包車或者金杯車來幫你搬運(yùn)。
一般來講,很容易遇到黑車,而且價(jià)格不標(biāo)準(zhǔn),我們做的這個(gè)行業(yè)就是將這種傳統(tǒng)的黑車行業(yè)進(jìn)行線上化,在產(chǎn)品形態(tài)上可理解為滴滴打車的出租車版。
本次分享內(nèi)容主要分為4個(gè)部分:
創(chuàng)業(yè)之初:快速迭代試錯(cuò)
58 速運(yùn)在 2014 年是作為 58 集團(tuán)下 20 多個(gè)孵化業(yè)務(wù)中的其中一個(gè),那個(gè)時(shí)期基本上是平均三個(gè)星期一個(gè)業(yè)務(wù)孵化上線,當(dāng)時(shí)有 20 多個(gè)業(yè)務(wù)孵化同時(shí)進(jìn)行。這個(gè)時(shí)間我們不斷的試錯(cuò),不斷去尋找 58 同城新的增長點(diǎn)。
從上圖中,大家可以看到,我們所有的服務(wù)都是基于一個(gè)數(shù)據(jù)庫來運(yùn)行的,這個(gè)系統(tǒng)之間只需要通過一些簡單的 tag 標(biāo)記就可以區(qū)分開業(yè)務(wù),系統(tǒng)迭代非常快。
對于新孵化的業(yè)務(wù),我們增加了一些簡單的業(yè)務(wù)邏輯就能實(shí)現(xiàn)這個(gè)產(chǎn)品的快速上線,我們在兩周內(nèi)實(shí)現(xiàn)了速運(yùn)用戶、商家的 APP 以及后端的產(chǎn)品上線。
派單-石器時(shí)代
這時(shí)的系統(tǒng)架構(gòu)是非常簡單的,我們稱之為“石器時(shí)代”,當(dāng)時(shí)所有的訂單調(diào)度的邏輯放在一個(gè) Jar 包,然后通過 MQTT 服務(wù)將訂單推送到司機(jī)的 APP 上。
當(dāng)時(shí)的訂單調(diào)度(也是我們最初級的訂單調(diào)度方案)是一個(gè)訂單搜索附近的司機(jī),然后由近到遠(yuǎn)的距離將訂單推送出去,司機(jī)搶單后即中單。因?yàn)樵趧?chuàng)業(yè)階段,我們需要吸引客戶、司機(jī),對于每單都會(huì)有補(bǔ)貼。
這個(gè)階段面臨的痛點(diǎn)如下:
針對以上痛點(diǎn),我們做了***次的技術(shù)引進(jìn)——遷庫、集群拆分。
***次技術(shù)演進(jìn):遷庫、集群解耦
為什么要遷庫?誰痛誰知道!不想受到其他業(yè)務(wù)小伙伴的影響,就要做到解耦。
一個(gè)最簡單的方案就是停服,把所有的服務(wù)停掉,然后把數(shù)據(jù)庫抽離出來,相對來講這是成本最簡單的。
但是停服會(huì)產(chǎn)生的影響:
我們采用的方案:將訂單表單獨(dú)地拆離出來,放在單獨(dú)的數(shù)據(jù)庫里,兩個(gè)數(shù)據(jù)庫之間使用雙向同步。
雙向同步需要解決的問題:
經(jīng)過多次的遷移,將原有的數(shù)據(jù)庫按照業(yè)務(wù)劃分成了訂單庫、結(jié)算庫、配置庫和軌跡庫等,每個(gè)數(shù)據(jù)庫會(huì)根據(jù)業(yè)務(wù)量容量的大小來配置數(shù)據(jù)庫物理機(jī)的內(nèi)核、內(nèi)存,減少成本。
高速發(fā)展:穩(wěn)定、高效
2015 年我們進(jìn)入了高速發(fā)展的階段,市場上出現(xiàn)了藍(lán)犀牛、1 號(hào)貨的、云鳥的等多個(gè)強(qiáng)勁的競爭對手。各方都是爭分奪秒,一個(gè)系統(tǒng)、功能,我需要抓緊把它給迭代上來,誰也不能比誰落后。
這個(gè)階段我們存在的問題:
這時(shí)我們進(jìn)行了第二次技術(shù)演進(jìn),我們稱之為“進(jìn)行了奔跑中的火車換輪子”,我們進(jìn)行了服務(wù)化解耦;緩存、分庫分表,提升系統(tǒng)性能;接入大數(shù)據(jù)平臺(tái),進(jìn)行復(fù)雜需求的分析。
第二次技術(shù)演進(jìn):奔跑中的火車換輪子
派單-鐵器時(shí)代
我們將所有的系統(tǒng)都按服務(wù)模塊進(jìn)行了拆分,比如說結(jié)算、充值、推送、司機(jī)任務(wù)等,現(xiàn)在大概已有 20+ 個(gè)服務(wù),每個(gè)服務(wù)都有獨(dú)立的數(shù)據(jù)庫,有獨(dú)立的負(fù)責(zé)人。
這樣就可以做到我自己的代碼我自己來寫,別人都不允許去插手。
此外我們進(jìn)行了推送的多通道化,從上圖可以看到,我們針對每個(gè)司機(jī)選取了兩種推送通道,同時(shí)我們也建議大家在做推送消息時(shí)采取這種方案。
拿小米的手機(jī)來說,“小米”推送通道的到達(dá)率是***的,但小米的通道在華為的手機(jī)上,到達(dá)率不如“個(gè)推”的推送到達(dá)率高。
我們就會(huì)根據(jù)司機(jī)的機(jī)型來選取一個(gè)到達(dá)率***的三方通道。同時(shí)在設(shè)計(jì)上不能有單點(diǎn),假如說小米的通道出現(xiàn)了問題,那我們的服務(wù)就不可用了,司機(jī)接收不到訂單,用戶的需求就沒法得到滿足。
所以我們還有一個(gè)自研渠道 TCP 通道,這個(gè) TCP 通道除了和我們?nèi)酵ǖ雷鲆粋€(gè)雙通道?;钔猓€可以做一些數(shù)據(jù)的上傳。
這時(shí)的訂單調(diào)度,被稱為探索階段,初期的距離推送效果有限,誰搶到誰就中單,司機(jī)的服務(wù)質(zhì)量我們沒有辦法去評判,補(bǔ)貼也是大眾化的。
所以我們自己研究了一個(gè)按象限推送的方法:
分庫分表
前面提到數(shù)據(jù)庫性能已經(jīng)成為瓶頸了,所以這里以一個(gè)用戶服務(wù)給大家講一下我們的分庫分表是怎么做的:
水平拆分比較簡單,大家也容易理解,而垂直拆分就是比如說我把一個(gè)用戶 10 個(gè)最常用的屬性放到一個(gè)組表里,把不常用的屬性放到另外一張表里面去,這樣可以減少 I/O 的操作,也可以提高整體的產(chǎn)品性能。
在這里水平拆分要重點(diǎn)提一下,就是如果資源允許,水平拆分還是建議分庫。
數(shù)據(jù)庫的性能瓶頸也是會(huì)受到硬件設(shè)備和網(wǎng)絡(luò) IO 的影響,如果訪問量持續(xù)增加,數(shù)據(jù)庫還是會(huì)成為瓶頸。
我們的水平拆分有兩種方法:
范圍法:用戶 ID 在 1K 萬以下的放到一個(gè)庫,1K 萬~2KW 以上的放到另外一個(gè)庫,這樣切分簡單,擴(kuò)容也方便,但是會(huì)存在數(shù)據(jù)庫之間的負(fù)載不均勻。
哈希法:根據(jù)用戶 ID 進(jìn)行哈希運(yùn)算,切分簡單,整體負(fù)載比較均衡,平滑遷移可能是需要我們?nèi)ソ鉀Q的難點(diǎn)。
拆分后的問題:
問題分析,“任何脫離業(yè)務(wù)架構(gòu)的設(shè)計(jì)都在耍流氓”:
前端解決方案:
這樣我直接通過這個(gè)表和 Patition key 進(jìn)來后先去找一下 uid,這樣就可以找到這個(gè) uid 在哪個(gè)庫,但是增加了一次數(shù)據(jù)庫的查詢。
運(yùn)營側(cè)需求解決方案:
注意這個(gè)后臺(tái)庫是千萬不能用于現(xiàn)場生產(chǎn)的,因?yàn)檫\(yùn)營會(huì)在上面做一些復(fù)雜的慢查詢,數(shù)據(jù)庫的響應(yīng)會(huì)非常慢。
到了 2016 年,競爭對手基本上已經(jīng)被消滅了,58 速運(yùn)已經(jīng)成為行業(yè)的領(lǐng)頭者了,如何使用更少的補(bǔ)貼獲取***化的收益?
我們有如下幾點(diǎn)反思:
平臺(tái)補(bǔ)貼是不是真的起到了作用,然后我們到底需要補(bǔ)多少錢才能幫助用戶完成訂單?
如何去盡量滿足用戶的需求?每個(gè)新用戶進(jìn)入平臺(tái)是有成本的,一個(gè)用戶的成本在幾十甚至到一百塊左右,如何滿足用戶的需求,讓用戶持續(xù)的留在平臺(tái)中。
平臺(tái)的司機(jī)良莠不齊,司機(jī)的收益應(yīng)如何分配?
第三次技術(shù)演進(jìn):戰(zhàn)斧項(xiàng)目
我們進(jìn)行了第三次的技術(shù)引進(jìn),我們稱之為戰(zhàn)斧項(xiàng)目,項(xiàng)目的定義:精準(zhǔn)、高效。
我們做了以下優(yōu)化:
智能時(shí)代:效率、精準(zhǔn)
智能模型訓(xùn)練
上圖為智能模型訓(xùn)練圖,首先我們會(huì)將訂單信息、用戶信息、司機(jī)信息、客司關(guān)系信息、訂單總體推送、司機(jī)接單等場景信息統(tǒng)一上傳到大數(shù)據(jù)平臺(tái)。
通過這種歸一化&分桶、XGBoost、特征組合、獨(dú)熱編碼等將這些數(shù)據(jù)分析為特征數(shù)據(jù)。
針對分析出來的特征數(shù)據(jù),我們需要對它進(jìn)行訓(xùn)練,如:訂單價(jià)格、訂單距離等特征在整個(gè)訂單派單中起到的權(quán)重。
因?yàn)樘卣骱芏?,?jì)算出來的權(quán)重可能并不是一個(gè)***的解,只能說是近優(yōu)、***的一個(gè)解法,通過不斷地迭代優(yōu)化,最終訓(xùn)練出來最終的模型。
訂單-模型運(yùn)用
訂單模型的運(yùn)用:
派單-智能時(shí)代
上圖是智能派單時(shí)代的系統(tǒng)架構(gòu)圖。用戶在下完單以后,訂單會(huì)進(jìn)入到我們整體的策略系統(tǒng),它包含推送系統(tǒng)、補(bǔ)貼系統(tǒng)、價(jià)格系統(tǒng)、任務(wù)系統(tǒng)等。
然后通過特征匹配系統(tǒng),計(jì)算出一個(gè)***的訂單調(diào)度解,將這個(gè)訂單推送到司機(jī)的單隊(duì)列引擎和訂單的排序策略引擎,最終通過我們的推送服務(wù)將訂單推送給司機(jī)。
策略分流+監(jiān)測
智能系統(tǒng)需要有不同的算法在線上實(shí)驗(yàn),當(dāng)我們一些新算法研發(fā)完成以后,肯定不能用 100% 的流量在線上進(jìn)行驗(yàn)證算法的可行性,如果有問題,會(huì)對線上業(yè)務(wù)產(chǎn)生影響。
我們一般取 5% 或 10% 的流量在線上驗(yàn)證,根據(jù)用戶手機(jī)號(hào)、設(shè)備碼、用戶屬性等,以及取模、集合等方式。對線上算法驗(yàn)證時(shí),如何實(shí)時(shí)的監(jiān)測算法的效果,避免錯(cuò)誤算法對線上業(yè)務(wù)造成的影響?
如上圖所示,用戶在 APP 中的每個(gè)步驟、運(yùn)用了哪個(gè)算法,我們都會(huì)將用戶的 ID、采用的算法 ID 通過日志上報(bào)到統(tǒng)計(jì)平臺(tái)。業(yè)務(wù)監(jiān)控平臺(tái)會(huì)實(shí)時(shí)進(jìn)行監(jiān)控,對于出現(xiàn)異常的算法就自動(dòng)關(guān)閉分流。
特征計(jì)算
特征數(shù)據(jù)中有 40 多萬個(gè)特征,每個(gè)訂單需要推送給很多個(gè)司機(jī),需要進(jìn)行上萬次的運(yùn)算,需要在幾十毫秒內(nèi)給出計(jì)算結(jié)果,如何保證計(jì)算的高性能呢?
我們采用的是這種階段性事件驅(qū)動(dòng)的計(jì)算方式來***化提高并行計(jì)算的能力。
如圖所示,這是我們的計(jì)算鏈,里面包含多個(gè) Stage,包含準(zhǔn)備階段、轉(zhuǎn)化階段、取數(shù)階段和計(jì)算階段。
每一個(gè)階段都有自己獨(dú)立的線程池,根據(jù)每個(gè)階段的特征設(shè)置核心線程數(shù),同時(shí)整個(gè)計(jì)算鏈做到了可插拔的形式,方便業(yè)務(wù)調(diào)整。
利器-監(jiān)控平臺(tái)
監(jiān)控可以說是整個(gè)架構(gòu)演進(jìn)過程中非常重要的部分:
立體化監(jiān)控
目前已經(jīng)做到的監(jiān)控包含:關(guān)鍵字、接口、流量、端口,JVM、CPU、線程、緩存、DB 所有的監(jiān)控等等,同時(shí)還有服務(wù)治理,當(dāng)服務(wù)節(jié)點(diǎn)發(fā)生異常,實(shí)時(shí)切換。
業(yè)務(wù)化的指標(biāo)監(jiān)控,渠道轉(zhuǎn)化率、渠道取消率、渠道推送數(shù)量、異常訂單數(shù)量等等,如果出現(xiàn)異常,***時(shí)間預(yù)警。
調(diào)用跟蹤系統(tǒng)
很多互聯(lián)網(wǎng)公司都已經(jīng)在使用調(diào)用跟蹤系統(tǒng),目的是需要看到 APP 發(fā)起的每個(gè)請求在整個(gè) Service 后端走過的所有過程,效果如下圖所示,可以監(jiān)控到每一步所調(diào)用的服務(wù)和耗時(shí)。
總結(jié)
***給大家總結(jié)了 5 點(diǎn)經(jīng)驗(yàn):
胡顯波,58 到家技術(shù)經(jīng)理、58 速運(yùn)后端架構(gòu)總負(fù)責(zé)人。2014 年 7 月加入 58 到家,先后負(fù)責(zé) 58 到家 APP、58 小時(shí)工、58 美甲等,見證了 58 到家飛速發(fā)展。2014 年 11 月負(fù)責(zé) 58 速運(yùn)整體業(yè)務(wù),帶領(lǐng)團(tuán)隊(duì)小伙伴支撐了速運(yùn)業(yè)務(wù)日訂單從 0~50W 的飛速增長。

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流