58速運(yùn)“里程計(jì)算”優(yōu)化與演進(jìn)
58速運(yùn)貨物運(yùn)輸,滴滴快遞網(wǎng)約車(chē),司機(jī)端都是按照行駛公里數(shù)收費(fèi)的,所以“里程”的準(zhǔn)確性,是這類(lèi)業(yè)務(wù)的一個(gè)核心難題,“里程計(jì)算”方案演進(jìn),以及其中優(yōu)化思想,是本文要討論的問(wèn)題。
一、直接調(diào)用地圖API
這是最容易想到的方法,最省事,但司機(jī)往往不是按照預(yù)定的路線(xiàn)行駛的,很有可能因?yàn)槎萝?chē)、道路封閉等改變路線(xiàn),所以直接調(diào)用地圖API,一次性計(jì)算出一個(gè)預(yù)估值,不太靠譜
優(yōu)化方案:根據(jù)實(shí)際路線(xiàn)計(jì)算里程
二、司機(jī)APP實(shí)時(shí)計(jì)算增量里程,服務(wù)端存儲(chǔ)總里程
過(guò)程如下:
(1)貨車(chē)位置不停的在改變,司機(jī)APP每隔一段時(shí)間(例如1s)記錄一次GPS,即打點(diǎn)
(2)實(shí)時(shí)計(jì)算相鄰兩點(diǎn)的距離,上報(bào)服務(wù)端
(3)服務(wù)端存儲(chǔ)總里程
潛在問(wèn)題:GPS可能不準(zhǔn)確,偶爾會(huì)有噪點(diǎn),一旦有噪點(diǎn),相鄰兩點(diǎn)的距離會(huì)很遠(yuǎn),導(dǎo)致最終總里程可能比實(shí)際里程遠(yuǎn)
優(yōu)化方案:不能實(shí)時(shí)計(jì)算增量,而應(yīng)該先打點(diǎn),最終統(tǒng)一計(jì)算,這樣才有機(jī)會(huì)去除噪點(diǎn)
三、打點(diǎn)上報(bào)服務(wù)端,服務(wù)端統(tǒng)一計(jì)算里程
過(guò)程如下:
(1)貨車(chē)位置不停的在改變,司機(jī)APP每秒打一個(gè)點(diǎn),上報(bào)服務(wù)端
(2)服務(wù)端將打點(diǎn)落地,記錄數(shù)據(jù)庫(kù)
(3)到達(dá)目的地后,服務(wù)端對(duì)于所有點(diǎn)進(jìn)行統(tǒng)一處理,一次性計(jì)算里程,可以去除噪點(diǎn)
潛在問(wèn)題:假設(shè)每單平均貨運(yùn)時(shí)長(zhǎng)1小時(shí),即每單要打3600個(gè)點(diǎn),58速運(yùn)每天100w訂單,即總共要打36億個(gè)點(diǎn),每個(gè)點(diǎn)對(duì)應(yīng)數(shù)據(jù)庫(kù)一個(gè)寫(xiě)請(qǐng)求,則數(shù)據(jù)庫(kù)的寫(xiě)壓力大概在每秒4w次,扛不住
優(yōu)化方案:批量寫(xiě)是一種常見(jiàn)的降低數(shù)據(jù)庫(kù)壓力的方案
四、客戶(hù)端實(shí)時(shí)打點(diǎn),壓縮后批量上傳
過(guò)程如下:
(1)司機(jī)APP每秒在本地打點(diǎn),每隔一段時(shí)間(例如20s),壓縮,上報(bào)服務(wù)端,服務(wù)端壓力從4w降低到2k
(2)服務(wù)端解壓,批量寫(xiě)入隊(duì)列
(3)隊(duì)列中的點(diǎn),每隔一段時(shí)間(例如2s)再寫(xiě)入數(shù)據(jù)庫(kù)
優(yōu)化成果:大大降低了數(shù)據(jù)庫(kù)壓力(由于存儲(chǔ)量較大,實(shí)際優(yōu)化的過(guò)程中,使用Hbase進(jìn)行了優(yōu)化存儲(chǔ))
其他問(wèn)題:數(shù)據(jù)庫(kù)壓力降下來(lái)了,但到達(dá)目的地后,一個(gè)訂單打的所有點(diǎn)計(jì)算里程,成本較高,如何減少計(jì)算量
優(yōu)化方案:去除無(wú)效點(diǎn)
五、打點(diǎn)過(guò)濾,提高效率
什么樣的打點(diǎn)是無(wú)效點(diǎn),需要去除呢?
(1)噪點(diǎn)原則:連續(xù)打點(diǎn),偏移量較大的噪點(diǎn),需要去除
(2)同點(diǎn)原則:相同位置的點(diǎn)可以去除,因?yàn)橐苿?dòng)路徑為0
(3)速度原則:行駛速度超過(guò)合理范圍的點(diǎn),需要去除
(4)角度原則:理論上訂單軌跡是平滑有序的,如果角度反復(fù)折回,可以視為無(wú)效點(diǎn)
潛在問(wèn)題:如果司機(jī)APP有斷網(wǎng)或者信號(hào)不好,可能會(huì)漏點(diǎn),導(dǎo)致計(jì)算出的總距離小于實(shí)際距離,給司機(jī)帶來(lái)?yè)p失
優(yōu)化方案:補(bǔ)點(diǎn)
六、事后補(bǔ)點(diǎn),數(shù)據(jù)修正,計(jì)算里程
如何進(jìn)行補(bǔ)點(diǎn),如何進(jìn)行數(shù)據(jù)修正呢?
(1)補(bǔ)點(diǎn):車(chē)輛行駛過(guò)程中,如果有中斷路線(xiàn),采用“地圖路徑規(guī)劃”的方式補(bǔ)點(diǎn)
(2)修正:采用卡爾曼濾波算法,對(duì)軌跡進(jìn)行整形
(3)計(jì)算里程:按照點(diǎn)到點(diǎn)的距離,進(jìn)行累加
總結(jié)
“里程計(jì)算”的優(yōu)化歷程:
- 直接調(diào)用地圖API
- 司機(jī)APP實(shí)時(shí)計(jì)算增量里程,服務(wù)端存儲(chǔ)總里程
- 打點(diǎn)上報(bào)服務(wù)端,服務(wù)端統(tǒng)一計(jì)算里程
- 客戶(hù)端實(shí)時(shí)打點(diǎn),壓縮后批量上傳
- 打點(diǎn)過(guò)濾,提高效率
- 事后補(bǔ)點(diǎn),數(shù)據(jù)修正,計(jì)算里程
“里程計(jì)算”業(yè)務(wù)并不是所有公司都會(huì)涉及到,但其中的優(yōu)化思路,很多還是可以借鑒的:
- 單次與統(tǒng)籌:客戶(hù)端單次記錄與計(jì)算是不靠譜的,應(yīng)該由服務(wù)端來(lái)實(shí)施,綜合所有數(shù)據(jù),去除噪點(diǎn)
- 單次與批量:?jiǎn)未尾僮?,壓力較大,不好壓縮;批量操作能大大降低壓力,并且壓縮比高
- 全量與過(guò)濾:全量計(jì)算成本較高,過(guò)濾掉無(wú)效數(shù)據(jù),能夠降低計(jì)算量,提高精確性
- 補(bǔ)充與修正:對(duì)于少量缺少的數(shù)據(jù),可以預(yù)測(cè)補(bǔ)充,平滑修正
【本文為51CTO專(zhuān)欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】