东南亚的超级APP是如何用Go打造Grab的路径规划和ETA引擎
胡泊:Grab/地圖團(tuán)隊(duì)資深架構(gòu)師。
入行10年,前端、后端、大數(shù)據(jù)均有涉獵。現(xiàn)就職于Grab,從零開始搭建了Grab路徑規(guī)劃服務(wù),經(jīng)過三年努力,在多項(xiàng)指標(biāo)上擊敗國際地圖服務(wù)商和東南亞本地地圖服務(wù)商,成為Grab業(yè)務(wù)的主要支撐力之一。
大家好,我是來自Grab的胡泊。非常榮幸有機(jī)會(huì)跟大家分享我們是如何用Go搭建Grab路徑規(guī)劃和EAT的引擎。本次演講我分以下幾個(gè)部分:
一、Who’s Grab
二、團(tuán)隊(duì)角色
三、路徑規(guī)劃和ETA引擎的構(gòu)建和演進(jìn)
四、Go in Grab
Who’s Grab
首先什么是Grab?去年 Gopher? China大會(huì)上,我們自我介紹我們是東南亞最大的出行平臺(tái),但是不想做送餐的出行不是好支付,我們?cè)谑召徚薝ber東南亞的業(yè)務(wù)后,開始在出行、送餐和支付等各個(gè)領(lǐng)域發(fā)力,希望成為東南亞的Super APP,簡單說就是滴滴加美團(tuán)加螞蟻金服。
? ? ?
團(tuán)隊(duì)角色
什么是路徑規(guī)劃呢?就是給定起點(diǎn)和終點(diǎn),規(guī)劃一條合理的路徑。什么是ETA呢?它是Estimated Time of Arrival的縮寫,在我們業(yè)務(wù)場景中的意思就是給定一個(gè)路線,預(yù)計(jì)一個(gè)行駛的時(shí)間。這個(gè)詞在英語里面還有一個(gè)含義就是"什么時(shí)候能做完",所以當(dāng)我在公司內(nèi)部交流工具里把ETA加為關(guān)鍵詞,一出現(xiàn)就發(fā)提醒后,全公司無論哪里出了問題,我都會(huì)被提醒,不幸成了全公司的oncall。
業(yè)務(wù)場景
派單
下面介紹一下路徑規(guī)劃和ETA在我們場景中起什么作用。大家對(duì)于出行和送餐業(yè)務(wù)場景非常熟悉,用戶下單第一步就是要找到一個(gè)合適的司機(jī)或者找到一個(gè)合適的騎手,而準(zhǔn)確計(jì)算司機(jī)到達(dá)時(shí)間和合理的騎手路線是派單中不可缺少的環(huán)節(jié),小而言之它會(huì)影響每一次消費(fèi)者和用戶的體驗(yàn),大而言之它會(huì)影響平臺(tái)的效果。平臺(tái)之間的競爭最核心的就是用戶的體驗(yàn)和整體的效率,所以這是支撐我們平臺(tái)最核心的引擎之一。
計(jì)價(jià)
計(jì)價(jià)同樣離不開準(zhǔn)確的距離和時(shí)間計(jì)算。我們計(jì)價(jià)特點(diǎn)和國內(nèi)不一樣,我們是一口價(jià),當(dāng)乘客決定起點(diǎn)和終點(diǎn),就要給出固定價(jià)格。生活中,我們會(huì)遇到很多在異國或是一些地方打車時(shí),明明是直線,在沒有Grab時(shí),打出租車,上車后司機(jī)就開始繞行,乘客在這情況下往往沒有安全感。為了給用戶帶來安全體驗(yàn),讓他們安心,我們決定一口價(jià)。當(dāng)然這也就給我們帶來壓力,乘客安心了,但是如果把錢算少了,司機(jī)肯定就不干了。
司乘體驗(yàn)
下面談?wù)勊境梭w驗(yàn)。當(dāng)我們叫到一輛車,不僅顯示司機(jī)什么時(shí)間到,而且會(huì)展示路線和路況,這樣乘客會(huì)知道司機(jī)堵在哪兒,緩解未知的焦慮。還有ERP,這是新加坡的收費(fèi)站,他們收費(fèi)站跟我們收費(fèi)不一樣,他們?cè)诘缆仿窳舜鸥芯€圈,車輛經(jīng)過時(shí)就會(huì)收費(fèi)。這個(gè)乘客在車上很難感受到,而我們知道行使路線和狀態(tài),所以會(huì)主動(dòng)給乘客發(fā)推送,讓乘客清楚知道價(jià)格為什么發(fā)生變化。
另外我們非常重視安全,因?yàn)槲覀冎李A(yù)計(jì)行使軌跡,還知道司機(jī)的位置、速度等一些實(shí)際狀態(tài),這樣我們就能檢測異常。司機(jī)是否在超速,是否逆行,或者明明這段路很順暢,但是檢測到司機(jī)發(fā)生異常停留,那可能就是發(fā)生了這兩種情況: 要么司機(jī)出了車禍,要么發(fā)生一些不安全事件,我們安全組會(huì)迅速采取行動(dòng)降低這種事件的發(fā)生。
綜上所述,我們路徑規(guī)劃和ETA是公司出行和送餐非常底層的技術(shù)引擎,支撐公司和用戶體驗(yàn)和效率。
路徑規(guī)劃和ETA引擎的構(gòu)建和演進(jìn)
下面詳細(xì)介紹一下我們搭建ETA系統(tǒng)的歷史和心路歷程。在Grab北京研發(fā)中心剛成立時(shí),有一天 CTO 把我們叫到一個(gè)會(huì)議室,在白板密密麻麻畫了一個(gè)線團(tuán),然后點(diǎn)了兩個(gè)點(diǎn),說我們有東南亞最豐富軌跡的數(shù)據(jù),我們能不能從中計(jì)算出 A 點(diǎn)到 B 點(diǎn)的時(shí)間。大家面面相覷,然后他又接著問了我們一個(gè)直擊靈魂的問題,ETA是什么?(什么時(shí)候能做完?)。領(lǐng)導(dǎo)發(fā)話了,我們就要找到解決方案。領(lǐng)導(dǎo)說的直接根據(jù)軌跡計(jì)算ETA ,其實(shí)還是探索領(lǐng)域,暫時(shí)沒有很好的工程落地實(shí)踐。我們還探索了一種方案: 把地圖打成一個(gè)個(gè)格子,把兩點(diǎn)間的時(shí)間計(jì)算轉(zhuǎn)移成格子間概率轉(zhuǎn)移的計(jì)算。但缺點(diǎn)是格子的大小很難定義,太大準(zhǔn)確性無法保障,太小復(fù)雜度很難控制,最終我們還是決定把路網(wǎng)抽象成圖,把問題轉(zhuǎn)換成圖搜索問題。
地圖
開源地圖OSM
既然我們決定了大的技術(shù)方向是要用循路算法,那第一個(gè)問題就是:地圖在哪兒?這一幅圖是達(dá)芬奇的《救世主》,表達(dá)了我第一次見到OSM時(shí)的內(nèi)心感受。相信大家都從開源軟件收益很多,有很多偉大的軟件讓我們使用,這是我第一次發(fā)現(xiàn)還有開源數(shù)據(jù)這樣方便實(shí)用的東西。
OSM發(fā)展歷程
簡單回顧下OSM 的發(fā)展歷程: 它在2004年最開始是眾包的形式,鼓勵(lì)地圖愛好者通過騎車和駕駛收集GPS數(shù)據(jù),然后編輯后上傳。很快,互聯(lián)網(wǎng)巨頭敏銳嗅到了其中的商業(yè)價(jià)值,紛紛加入了貢獻(xiàn)數(shù)據(jù)的行列。最早他們用測繪車采集數(shù)據(jù),但是這個(gè)成本非常高,效率非常低。像今天 Facebook 更多采用 AI 的手段,通過衛(wèi)星圖像識(shí)別,自動(dòng)化把地圖補(bǔ)上,這個(gè)大大降低成本,提高效率。
雖然這些巨頭在補(bǔ)充這個(gè)數(shù)據(jù),但是我們面臨的問題是這些巨頭們的商業(yè)范疇主要以歐美為主,以及OSM在歐美比較活躍,在亞洲的參與者比較少。我們剛接觸這個(gè)項(xiàng)目,探索地圖質(zhì)量,發(fā)現(xiàn)以北京為例就是五環(huán)以內(nèi)的主要道路有,五環(huán)以外很可能是一片空白,而且里面缺少了很多的毛細(xì)血管的道路,所以我們首先要做的就是補(bǔ)充數(shù)據(jù)。不但要補(bǔ)充整個(gè)路網(wǎng)信息,還有補(bǔ)充路的屬性,比如確認(rèn)這條路是不是單向路,是不是有禁止左轉(zhuǎn),這都是為了圖的連通性完整。補(bǔ)充數(shù)據(jù)來源也是剛才CTO提到的: 我們有東南亞最豐富的軌跡數(shù)據(jù),同時(shí)我們還采集街景圖像。
路網(wǎng)學(xué)習(xí)
下面介紹我們經(jīng)過迭代非常行之有效的方法。我們最后采取的是圖形學(xué)的方法,最左邊是一個(gè)GPS軌跡點(diǎn)的圖片,準(zhǔn)確說是map matching失敗的點(diǎn)。隨著不斷有司機(jī)經(jīng)過,GPS累積,我們就能找到這一塊路的輪廓,這一塊就是疑似缺失的道路。我們把這個(gè)轉(zhuǎn)換成圖形學(xué)問題,通過一系列灰度化,找輪廓,找中心線的操作,我們就比較準(zhǔn)確找到缺失道路的位置。我們會(huì)把這些數(shù)據(jù)給我們離線團(tuán)隊(duì)進(jìn)行審核編輯,幫助我們補(bǔ)充路網(wǎng)。
? ? ?
這是經(jīng)過我們這些努力,使雅加達(dá)2016年基本空白到現(xiàn)在基本上把“毛細(xì)血管”補(bǔ)充非常完整。整個(gè)Grab團(tuán)隊(duì)在這幾年和離線團(tuán)隊(duì)配合,總共給東南亞補(bǔ)充了超過10萬公里的道路。這些大概相當(dāng)于繞赤道兩周。而且這些數(shù)據(jù)我們都回饋給了開源社區(qū),如果大家想到東南亞創(chuàng)業(yè),也可以使用這些數(shù)據(jù)。
司機(jī)定位
有了地圖,其實(shí)還是不夠,剛才提到了,我們最核心的問題是要根據(jù)兩個(gè)點(diǎn)來計(jì)算一個(gè)路徑或者是一個(gè)時(shí)間,這兩個(gè)點(diǎn)的準(zhǔn)確性實(shí)際也是非常重要的。這個(gè)圖有一點(diǎn)點(diǎn)夸張了,很多年前一個(gè)順風(fēng)車的截圖,看到這張圖司機(jī)還在朝鮮半島,隔海相望,不太順路。
GPS誤差
剛才那個(gè)例子有些夸張,我們實(shí)際遇到的主要問題是GPS的會(huì)受到天氣或者高樓被干擾信號(hào)。如圖,判斷司機(jī)到底行駛在綠色點(diǎn)的路還是藍(lán)色點(diǎn)的路,這是我們要解決的問題。 ?
?? ??
? ? ? ?? ? ?
剛才也提到了一個(gè)詞:可能性,所以我們把這個(gè)定位問題轉(zhuǎn)化成概率問題,通過概率模型解決,我們選擇的是隱馬爾可夫模型,這里其實(shí)是經(jīng)典的解碼問題。這里稍微介紹一下HMM,它的核心是有一條隱藏狀態(tài)鏈,一條觀測狀態(tài)鏈,還有狀態(tài)間概率轉(zhuǎn)換的模型。
? ? ?
我們這里觀測狀態(tài)就是GPS點(diǎn),隱藏狀態(tài)就是司機(jī)到底真實(shí)的位置是什么?下面我們通過建立這個(gè)模型解決這個(gè)問題。
? ? ?
這張圖就是紅色點(diǎn)是GPS點(diǎn),就是我們觀測狀態(tài),我們第一步要找到的就是所有可能的隱藏狀態(tài),我們適用一個(gè)RTree進(jìn)行搜索,把GPS點(diǎn)投射到附近道路,這樣就有了備選的點(diǎn),在四個(gè)備選點(diǎn)找出哪兩兩相對(duì)可能性最大。這里給大家介紹一下,發(fā)射概率就是隱藏概率和觀測概率轉(zhuǎn)移的概率。我們的場景中就是GPS點(diǎn)到這個(gè)路的投射點(diǎn)的一個(gè)垂直距離,這個(gè)大家非常好理解,如果這個(gè)距離比較近可能性就比較大。
還有轉(zhuǎn)移的概率,就是兩個(gè)隱藏狀態(tài)間的轉(zhuǎn)移概率,這里就是候選點(diǎn)間導(dǎo)航距離和直線距離的比例。這個(gè)也很好理解,因?yàn)檫@是一個(gè)時(shí)序的序列,如果這兩個(gè)投射點(diǎn)導(dǎo)航距離繞很大的圈這個(gè)概率就非常低。有了算法,下一步就是要解決和面對(duì)工程的問題,首先我們做了一些過濾,去掉了低速的狀況和路口的狀況,下一步最核心的問題是管理海量數(shù)據(jù),我們有數(shù)百萬在線司機(jī),會(huì)上傳海量數(shù)據(jù),而且這些數(shù)據(jù)要在各個(gè)微服務(wù)之間進(jìn)行傳播,這么海量的數(shù)據(jù)需要一些手段進(jìn)行處理。
? ? ?
第一個(gè)方法就是剪枝,在這個(gè)距離導(dǎo)航過程中,如果探索需要很長時(shí)間,我們要快速丟棄掉。
第二個(gè)方法是用谷歌的方法,坐標(biāo)點(diǎn)大家非常熟悉,就是兩個(gè)經(jīng)度緯度兩個(gè)浮點(diǎn)數(shù),谷歌怎么做呢?它把浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù),然后不用再存每一個(gè)坐標(biāo)的具體值,而是只需要增量可以了,也就是第二個(gè)坐標(biāo)和第一個(gè)坐標(biāo)的差,這樣就只需要存一個(gè)幾百或者幾千這樣的小整數(shù),這樣就能很好的節(jié)省空間。
我們還用到了Golang的gob。大家對(duì)protobuf都很熟悉,而Golang提供的gob不需要額外的schema,只要復(fù)用struct結(jié)構(gòu)就可以,效率也非常好。這也是我們對(duì)于Golang很深的感受。就是他在保障性能的基礎(chǔ)上,讓代碼寫起來很簡單舒服。?
? ? ? ? ? ? ?
我們花這么長時(shí)間定位這些點(diǎn),也不只是為了定位起終點(diǎn),一個(gè)個(gè)點(diǎn)定位準(zhǔn)之后,再通過聚集實(shí)際就形成了路況數(shù)據(jù),這是導(dǎo)航中不可缺少的因素。這張圖是雅加達(dá)日常“寧靜“的夜晚,我第一次去雅加達(dá)出差晚上12點(diǎn)飛機(jī),7點(diǎn)我還在辦公室,領(lǐng)導(dǎo)說你怎么還不走?我想我怎么也是在北京堵過的人,但是雅加達(dá)3000萬多的人口,跟北京一樣多的車,或許還有同樣多的摩托車,再再減去大家遵守的規(guī)則,就形成了非常混亂的路況。東南亞的城市大家可能旅游過,泰國、馬尼拉各個(gè)城市都是這樣,路況對(duì)我們非常非常重要。我們面臨最核心的問題,想分享一下還是海量的數(shù)據(jù)。
? ? ?
? ? ?
路況
路況支持了多個(gè)業(yè)務(wù)產(chǎn)品,比如說我們要去更新這個(gè)權(quán)重,我們要把路況渲染鋪到APP界面上,其中還有一個(gè)情況給我們?cè)斐煞浅4蟮膲毫?#xff0c;就是給機(jī)器學(xué)習(xí)提供路況特征,這個(gè)特征是這樣的,每一次計(jì)算我們要把這個(gè)結(jié)果拆成每一個(gè)路段,每一個(gè)路段獲取這個(gè)路段的路況信息,這相當(dāng)于我們這個(gè)路況的量相當(dāng)巨大的ETA的QPS乘以平均路段分解的數(shù)量,這個(gè)達(dá)到幾千萬的量級(jí),非常可怕。最早我們很天真,直接上Redis,一個(gè)節(jié)點(diǎn)不夠就上六十個(gè),萬萬沒想到依然無法撐住海量的讀操作。
? ? ?
我們最開始的優(yōu)化就是加內(nèi)存緩存層,我們實(shí)現(xiàn)了RingBuffer的結(jié)構(gòu),維護(hù)的值是這個(gè)路段的過去數(shù)個(gè)時(shí)間窗口不同的值,這樣我們就把讀Redis做了平滑,壓力大大緩解了,可以支撐我們的業(yè)務(wù),但是這個(gè)帶來新的問題,每一個(gè)Client不得不在內(nèi)存維護(hù)這樣數(shù)據(jù),帶來了內(nèi)存和CPU的消耗。我們繼續(xù)演進(jìn),下一步的想法就是用Spark Streaming來做增量化讓客戶端讀取數(shù)據(jù)。這也很方便定制聚集化,路況是有不同的時(shí)間段,有的需要5分鐘為窗口聚集,也的需要1分鐘,這樣可以通過訂閱不同的流來解決。這里一些詳細(xì)的信息不方便透露,在申請(qǐng)專利。
? ? ?
有了地圖、有了定位,有了路況,數(shù)據(jù)已經(jīng)備齊,我們開始面對(duì)算法問題。這個(gè)圖大家看起來非常親切和懷念,Dijkstra,一下把我們帶回大學(xué)課堂。這是大家最熟悉最經(jīng)典的一個(gè)算法,但非常遺憾,我們業(yè)務(wù)量非常大,它無法支撐住我們業(yè)務(wù)量。我們就尋找和研究新的尋路算法,最核心的思想是用預(yù)處理換一個(gè)快速處理時(shí)間,通過預(yù)處理提高查詢速度。我們最終選擇了CH,這個(gè)算法做到了預(yù)處理時(shí)間和查詢時(shí)間非常平衡。他有一個(gè)核心的思想,他希望當(dāng)距離比較遠(yuǎn)的時(shí)候,在搜索時(shí)只探索相對(duì)重要的道路。比如說搜索中關(guān)村到國貿(mào),我們肯定不希望在圖搜索過程當(dāng)中過多搜尋回龍觀小區(qū)的路,而希望直接引向四環(huán)。
? ? ?
舉一個(gè)例子詳細(xì)介紹預(yù)處理的過程。顧名思義,CH的意思就是壓縮和分層。舉一個(gè)極端的例子做一個(gè)簡單的解釋。這個(gè)圖在現(xiàn)實(shí)不太可能出現(xiàn)。我們想選尋找1到15的路徑,在傳統(tǒng)算法中就是一個(gè)一個(gè)節(jié)點(diǎn)探。CH怎么做的呢?首先分層,大家可以看到每一個(gè)節(jié)點(diǎn)落到了相應(yīng)不同的高度,這個(gè)是層級(jí)。這個(gè)層怎么用呢?預(yù)處理之后,跑的是雙向Dijkstra,他要求找1到15,首先從1和15兩個(gè)方向照,1正向找,15反向找,都只找更高層次的節(jié)點(diǎn),大家看原來4到8,5到11節(jié)點(diǎn),這樣明明存在通路被打斷了,他的處理方式是增加了快捷邊,通俗地說,當(dāng)出現(xiàn)4、5、6這樣的波谷,就會(huì)建立4到6的快捷邊,快捷邊基礎(chǔ)上會(huì)不斷創(chuàng)建新的快捷邊,建完了這些快捷邊之后,一是這個(gè)論文論證了一定會(huì)確保結(jié)果的準(zhǔn)確性。二是看到大大提升了這個(gè)查詢的效率。原來1到15這么多路的查詢,變成雙向快速幾步可以做到,這就是CH大概的中心思想。?
? ? ? ? ? ? ?
有了CH算法,我們解決算法層的問題。下面也遇到了很多性能的問題。我們也是通過調(diào)優(yōu)過程中找到一些小的點(diǎn),跟大家分享一下。第一是一定重用map/slice。第二是圖的結(jié)構(gòu),經(jīng)典的圖結(jié)構(gòu)是臨接鏈表等,我們的經(jīng)驗(yàn)是flatten成一個(gè)長的數(shù)組,這樣可以減少內(nèi)存的開銷。下面有一點(diǎn)反直覺,坐標(biāo)是一個(gè)經(jīng)度、一個(gè)緯度,這是WGS84坐標(biāo),實(shí)際上還有其他的坐標(biāo),比如墨卡托投影坐標(biāo)。當(dāng)程序員發(fā)現(xiàn)不同類型的坐標(biāo),第一反應(yīng)就是抽象一個(gè)接口。但是當(dāng)發(fā)現(xiàn)程序里面有數(shù)億的坐標(biāo),這個(gè)接口本身的開銷就不能忽視,所以接口的使用也需要謹(jǐn)慎。我們首先還是要考慮性能問題。
?? ? ? ? ? ? ?
下面分享圖權(quán)重調(diào)優(yōu)。這個(gè)圖很有意思。權(quán)重并不一定是距離和時(shí)間,我們不一定找最短的路和最快的路。我們希望找到的路是什么樣的路?最快也未必是最好,最短也未必是最好的,可能司機(jī)最愿意走的路才是最合理的,我們就通過運(yùn)籌學(xué)方法找到權(quán)重。這個(gè)優(yōu)化的過程剛才提到了,這個(gè)指標(biāo)的差值越來越小,我們也是不斷訓(xùn)練,希望讓這個(gè)權(quán)重不斷合理化,讓我們能夠找到的路徑變得越來越合理。
? ? ?
可能有了以上的這些數(shù)據(jù),能支撐大業(yè)務(wù)量的算法,對(duì)于傳統(tǒng)的導(dǎo)航公司已經(jīng)基本夠用了。我們?yōu)槭裁催€要繼續(xù)用機(jī)器學(xué)習(xí)的方法調(diào)優(yōu)呢?因?yàn)槲覀兠鎸?duì)兩個(gè)非常現(xiàn)實(shí)的問題,第一個(gè)我們?cè)诔跗诘貓D的質(zhì)量還是沒有保障,所以需要機(jī)器學(xué)習(xí)彌補(bǔ)這個(gè)措施。還有很重要的場景剛才提到了,叫到一個(gè)司機(jī)顯示司機(jī)到達(dá)時(shí)間,這個(gè)時(shí)間并不長,就是兩三分鐘。但是在東南亞大家很難想象,他們幾乎不會(huì)用導(dǎo)航軟件看路的,尤其東南亞很多都是摩托車、蹦蹦車。司機(jī)都是老鄉(xiāng)問路,不認(rèn)識(shí)路就下車問,所以不得不把行為因素考慮進(jìn)去。能想到的方法就是用機(jī)器學(xué)習(xí)方法進(jìn)行調(diào)優(yōu)。我們想到一些特征,比如說紅綠燈數(shù)、轉(zhuǎn)彎數(shù)還有司機(jī)畫像,不斷演進(jìn)過程。
從這個(gè)圖可以看出,我們使用的XgBoost模型有成千上萬棵樹,在樹里通過不同的特征得到調(diào)整值,最后最后匯總,這聽起來就非常適合Go語言。Go語言就是性能保證情況下,寫起來非常順暢。但是我們這里也踩了小小的坑跟大家分享一下。離線訓(xùn)練模型還是主要用Python,在dump它訓(xùn)練出模型給線上Go使用時(shí),發(fā)現(xiàn)小數(shù)定五位之后精度無法保證,出現(xiàn)一些隨機(jī)性,導(dǎo)致線上和線下不一致。可以通過數(shù)字整形化,避免跨語言出現(xiàn)這樣一些問題。
下面分享下線下海量數(shù)據(jù)訓(xùn)練和模擬。由于Spark對(duì)Go支持不好,我們自己寫了一個(gè)簡單的分布式的系統(tǒng)進(jìn)行任務(wù)的分發(fā)和管理,好處是復(fù)用了線上核心代碼。我們Grab分實(shí)際環(huán)境和測試環(huán)境,在測試環(huán)境復(fù)用這些環(huán)境,在這個(gè)時(shí)間跑這些任務(wù)。有了這個(gè)系統(tǒng)之后發(fā)現(xiàn)大大提高了我們自己訓(xùn)練和模擬的效率。
? ? ?
同時(shí)Grab是非常注重?cái)?shù)據(jù)驅(qū)動(dòng)的公司。我們想上任何一個(gè)新模型和版本,可能經(jīng)過測試,在Grab內(nèi)部也有一個(gè)實(shí)驗(yàn)平臺(tái),可以非常方便幫助配置化使用,你可以定義一個(gè)時(shí)間周期、一個(gè)車型,只要配置好,就會(huì)自動(dòng)幫助你組織試驗(yàn),同時(shí)又完善的數(shù)據(jù)通道,這樣可以通過數(shù)據(jù)決策,到底你的模型是否合理。
Go in Grab
下面大概給大家介紹了流程,再就是介紹Go? in? Geo。我們?yōu)槭裁从肎o做系統(tǒng)?
第一是Grab系統(tǒng)中Go性能非常好。同時(shí)我們發(fā)現(xiàn)Go語言對(duì)于地圖環(huán)境非常多好用的工具。簡單介紹幾個(gè):第一是支持核心的地理幾何計(jì)算,這個(gè)非常方便;第二是處理OSM地圖的工具,第三是很有意思是MapBox實(shí)現(xiàn)的開源地圖渲染引擎,非常方便自己搭建一個(gè)地圖。后面不一一介紹了,都非常方便。
? ? ?
Grab內(nèi)部也是有成百上千的微服務(wù)。我們?cè)谶^程中有非常方便的工具,就是GrabKit,你注冊(cè)之后自動(dòng)生成非業(yè)務(wù)的相關(guān)代碼,這樣可以專注在業(yè)務(wù)層面,大大提升了開發(fā)的效率。
第二個(gè)是Gandalf,是自動(dòng)測試的平臺(tái),可以方便幫助我們進(jìn)行各種API的測試。
第三是Golangcamp,新兵訓(xùn)練營,任何一個(gè)人加入Grab,會(huì)在這個(gè)訓(xùn)練營實(shí)踐訓(xùn)練代碼。同時(shí)Grab非常推崇Gopher ,我們也在新加坡、越南支持了Gopher 新加坡、越南。還有我們Grab內(nèi)部的Gopher大神寫的Go DI的書。
我們還在持續(xù)的招聘。Grab總部在新加坡,在全球各地也是有多個(gè)研發(fā)中心,其中北京是最大的一個(gè)海外的研發(fā)中心,主要負(fù)責(zé)的業(yè)務(wù)包括剛才提到的送餐,這也是我們?cè)谌Πl(fā)展的新業(yè)務(wù),第二是地圖,通過我的分享,如果大家覺得地圖也比較有意思,歡迎加入我們。
Grab崇尚奮斗,但覺得奮斗不等于996,在955名單我寫PPT的時(shí)候排在第9位,我們不在加班的互聯(lián)網(wǎng)公司行業(yè)內(nèi),以上是全部分享,謝謝大家。
GO 中國征稿啦!
自“Go中國 ?” 公眾號(hào)上線以來,因?yàn)樵鷮?shí)的干貨(害羞)、前沿的解讀(嬌羞)、滿滿的福利一直深受 Gopher 們的喜愛,為了給大家?guī)砀邔?shí)力的干貨以及 Go 語項(xiàng)目開發(fā)經(jīng)驗(yàn),我們將開始對(duì)外征稿!
現(xiàn)在我們開始對(duì)外征稿啦!如果你有優(yōu)秀的 Go 語言技術(shù)文章想要分享,熱點(diǎn)的行業(yè)資訊需要報(bào)道等,歡迎聯(lián)系在菜單欄回復(fù)“投稿”“合作”聯(lián)系我們的小編進(jìn)行投稿。
總結(jié)
以上是生活随笔為你收集整理的东南亚的超级APP是如何用Go打造Grab的路径规划和ETA引擎的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实验2报告 胡泊
- 下一篇: 艺赛旗RPA 第三方库系列(二):提升