久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

50天10萬(wàn)行代碼,,一號(hào)專(zhuān)車(chē)系統(tǒng)重構(gòu)細(xì)節(jié)回顧

 jnstyle 2016-06-11

2013年底,,我關(guān)閉當(dāng)時(shí)的創(chuàng)業(yè)項(xiàng)目,無(wú)所事事之時(shí),,打電話向快的CEO Dexter請(qǐng)教,,當(dāng)時(shí)快的和大黃蜂剛剛合并,他建議我可以先和大黃蜂CEO李祖閩(Joe)聊聊,。

和Joe第一次見(jiàn)面是在虹橋火車(chē)站的一家肯德基里碰頭,,當(dāng)時(shí)我看不太懂打車(chē)這個(gè)項(xiàng)目,。那次碰面,我們聊的卻不是出租車(chē),,聊的全是專(zhuān)車(chē),。兩年多前的那時(shí)候,做這一塊的不多,,真正意識(shí)到這是個(gè)大機(jī)遇的且投入資源的創(chuàng)業(yè)公司比較少,。Joe跟我講了許多他對(duì)未來(lái)專(zhuān)車(chē)的構(gòu)想,一下子就挑起我非常大的興趣,,簡(jiǎn)單說(shuō)就是High了:),。

Joe也跟我講了現(xiàn)在公司在技術(shù)上碰到的一些瓶頸,限制了業(yè)務(wù)的開(kāi)展,,比較痛苦,,我們?cè)ò雮€(gè)小時(shí)的碰面,結(jié)果一聊聊了4個(gè)多小時(shí)后,,兩人意猶未盡,,又一起打車(chē)回市區(qū)聊了一路,下車(chē)的時(shí)候我和他約好第二天就去大黃蜂報(bào)到,。

故事就這樣展開(kāi)了,。。,。

定時(shí)炸彈

2013年12月26日,,剛?cè)肼毜牡谝惶欤铱吹搅舜蜍?chē)大戰(zhàn)滿地銷(xiāo)煙的慘狀,,快的,、滴滴、大黃蜂等多家打車(chē)公司剛剛在上海打過(guò)幾波大戰(zhàn),,當(dāng)時(shí)大黃蜂打車(chē)在上海市場(chǎng)出租車(chē)市場(chǎng)的占有率可以排進(jìn)前三,。快的大黃蜂合并后,,雖然明確大黃蜂未來(lái)的戰(zhàn)略方向轉(zhuǎn)做專(zhuān)車(chē)業(yè)務(wù),,同時(shí)也上線了第一版本的專(zhuān)車(chē)系統(tǒng),并將部分出租車(chē)請(qǐng)求轉(zhuǎn)發(fā)給快的打車(chē),。但出于種種因素考慮,,還是把一大部分的工作重心依然留在出租車(chē)上面,并沒(méi)有完全放棄出租車(chē)業(yè)務(wù),。

我初進(jìn)大黃蜂,,又恰逢臨近春節(jié),專(zhuān)車(chē)系統(tǒng)剛剛上線不久,,我們想要在上海做一次“春節(jié)50/100元專(zhuān)車(chē)接送機(jī)場(chǎng)(虹橋,、浦東兩個(gè)機(jī)場(chǎng))”的活動(dòng),但原來(lái)的產(chǎn)品及部分開(kāi)發(fā)人員出現(xiàn)了一些波動(dòng),,正在陸續(xù)辦理離職手續(xù),,留下的開(kāi)發(fā)人員狀態(tài)也不太穩(wěn)定,好在專(zhuān)車(chē)系統(tǒng)的即將離職的同學(xué)還比較靠譜,,被我拉著講了一個(gè)周末的數(shù)據(jù)庫(kù)表結(jié)構(gòu)及代碼,,于是我就是在邊看代碼邊熟悉系統(tǒng)的基礎(chǔ)上,進(jìn)行業(yè)務(wù)開(kāi)發(fā),,技術(shù)總監(jiān)寫(xiě)代碼不算什么,,其實(shí)后面重構(gòu)上線前期我還做過(guò)一整周的測(cè)試

2014年春節(jié)很快過(guò)去,,快的和滴滴在全國(guó)掀起一波補(bǔ)貼大戰(zhàn),,大黃蜂的出租車(chē)業(yè)務(wù)在上海市場(chǎng)協(xié)同快的也側(cè)面參與了一些,但大部分精力已經(jīng)開(kāi)始轉(zhuǎn)向?qū)\?chē)業(yè)務(wù),,我對(duì)原來(lái)的系統(tǒng)也已經(jīng)比較了解,,當(dāng)時(shí)的系統(tǒng)情況大致是這樣:


當(dāng)時(shí)出租車(chē)主要開(kāi)了兩個(gè)城市,上海和廣州,,各部署一套系統(tǒng),,數(shù)據(jù)庫(kù)、緩存,、Web服務(wù),、API、定時(shí)任務(wù)都在兩地部署,,由中心庫(kù)負(fù)責(zé)定時(shí)同步主要的數(shù)據(jù),,比如用戶信息等,但因?yàn)閮傻厥袌?chǎng)開(kāi)拓的時(shí)候,,運(yùn)營(yíng)策略不同,,比如各項(xiàng)優(yōu)惠、加急令,、司機(jī)補(bǔ)貼等政策在兩地各有不同,,于是就維護(hù)了兩套PHP代碼,大致邏輯相似,,細(xì)節(jié)又各有不同,。

而專(zhuān)車(chē)系統(tǒng)是后來(lái)開(kāi)發(fā),以Java為主要開(kāi)發(fā)語(yǔ)言,,基礎(chǔ)數(shù)據(jù)(用戶,、優(yōu)惠券、訂單等)依然依賴(lài)于出租車(chē)數(shù)據(jù)庫(kù),,但主要數(shù)據(jù)庫(kù)和代碼部署在上海,,因?yàn)閷?zhuān)車(chē)只開(kāi)了上海市場(chǎng),,所以暫時(shí)沒(méi)有什么影響。這樣的系統(tǒng)架構(gòu)限制了當(dāng)時(shí)的業(yè)務(wù)發(fā)展,,也給未來(lái)留下了許多定時(shí)炸彈,,下面我們會(huì)展開(kāi)討論。

但在這里需要申明一點(diǎn):看到這樣的系統(tǒng)結(jié)構(gòu),,確實(shí)存在許多不合理性,,單純一張九十幾個(gè)字段訂單表就能干掉一大票觀眾,但我要為其辯護(hù),,在當(dāng)時(shí)打車(chē)大戰(zhàn)初期,,業(yè)務(wù)的發(fā)展是野蠻式的,每天各種補(bǔ)貼政策,、活動(dòng)的調(diào)整,,開(kāi)發(fā)人手嚴(yán)重不足,,技術(shù)完全是被業(yè)務(wù)拖著跑,相信經(jīng)歷過(guò)創(chuàng)業(yè)這個(gè)階段的人都會(huì)有深刻感觸。

很顯然,,這樣的系統(tǒng)架構(gòu)已經(jīng)不能滿足當(dāng)前的業(yè)務(wù)需求,,越往后拖,,隱患越大,,定時(shí)炸彈越多,我評(píng)估下來(lái),,主要存在這么幾類(lèi)大的問(wèn)題:

1,、多地保存數(shù)據(jù),多地多份代碼不可維護(hù),。

  • 多地邏輯代碼冗余:代碼無(wú)法維護(hù)和管理,,添加一個(gè)業(yè)務(wù)邏輯要同時(shí)改兩份碼,或者只改一份,,但下一次增加新業(yè)務(wù)邏輯時(shí),,因?yàn)閮蓚€(gè)地區(qū)的代碼邏輯差異越來(lái)越大,需要非常小心,,坑越挖越深,;

  • 數(shù)據(jù)同步問(wèn)題:上海的乘客到廣州不能下單、優(yōu)惠券不見(jiàn)了,,反之亦然,,上海的乘客出差去外地后,也不能下上海的機(jī)場(chǎng),、車(chē)站的預(yù)約訂單,,甚至不能登陸;

  • 并發(fā)沖突:兩套數(shù)據(jù)的維護(hù),一不小心就出現(xiàn)數(shù)據(jù)不一致的問(wèn)題,,無(wú)法合并,,也留下被攻擊的隱患;

2,、無(wú)法快速開(kāi)城,,每開(kāi)一個(gè)城市都要部署一套存儲(chǔ)和代碼,準(zhǔn)備硬件,、進(jìn)機(jī)房、部署,、調(diào)試,,效率太低,還要做好數(shù)據(jù)的同步,,及當(dāng)?shù)氐男抡叩臉I(yè)務(wù)開(kāi)發(fā),,開(kāi)一個(gè)城市需要一個(gè)月左右的開(kāi)發(fā)周期。

3,、數(shù)據(jù)庫(kù)表結(jié)構(gòu)和代碼許多地方都是堆出來(lái)的,,不可維護(hù),比如一張訂單表有九十幾個(gè)字段,;PS: 你沒(méi)有看錯(cuò),,就是九十幾個(gè)字段。

4,、手機(jī)端通過(guò)輪詢(xún)接口調(diào)用API,,為了快速獲取成單、通知,、補(bǔ)貼政策調(diào)整等信息,。但毫無(wú)疑問(wèn),這個(gè)對(duì)于手機(jī)的資源消耗(流量,、電量)很大,,也增加服務(wù)器的開(kāi)銷(xiāo)。

5,、公共服務(wù)和業(yè)務(wù)代碼耦合太緊,,比如優(yōu)惠券、支付等模塊,;

6,、專(zhuān)車(chē)司機(jī)公里數(shù)計(jì)算不準(zhǔn)確,出租車(chē)司機(jī)帶有打表器,,專(zhuān)車(chē)司機(jī)主要靠手機(jī)GPS,,手機(jī)會(huì)有信號(hào)不準(zhǔn),接受不到GPS(跳點(diǎn)、斷點(diǎn),、隧道,、高架)等情況;

7,、系統(tǒng)壓力大,,活動(dòng)一上來(lái),慢查層出不窮,,各個(gè)狀況出現(xiàn),;

8、API接口沒(méi)有加密機(jī)制,,容易被刷,,用戶身份容易被竊取,;

9,、無(wú)法適應(yīng)專(zhuān)車(chē)靈活多變的業(yè)務(wù)場(chǎng)景,每做一個(gè)活動(dòng),,都需要2,3周的開(kāi)發(fā),;

還有許多細(xì)節(jié),比如輪詢(xún)接口直接訪問(wèn)數(shù)據(jù)庫(kù),、GPS坐標(biāo)系混亂,、司乘價(jià)格綁定、重復(fù)上報(bào)GPS,、電子圍欄不可維護(hù),、支付、定位,、保險(xiǎn),、第三方接口接入等,已不能滿足業(yè)務(wù)發(fā)展,,這里就不再一一列舉,。在這樣的前提下,內(nèi)部反復(fù)多輪溝通后,,我們啟動(dòng)了重構(gòu)計(jì)劃,。

和時(shí)間賽跑的重構(gòu)馬拉松

2014年4月9日,我們正式啟動(dòng)了重構(gòu),,重構(gòu)目標(biāo)就是在解決這些問(wèn)題的基礎(chǔ)上,,完成整個(gè)系統(tǒng)的第一階段的服務(wù)化工作,大致目標(biāo)包括有:

  • 設(shè)計(jì)一套靈活的專(zhuān)車(chē)系統(tǒng),,以應(yīng)對(duì)專(zhuān)車(chē)復(fù)雜的業(yè)務(wù)場(chǎng)景,;

  • 整個(gè)系統(tǒng),包括存儲(chǔ)及服務(wù)集中部署,便于管理維護(hù),;

  • 需要支持出租車(chē),、專(zhuān)車(chē)兩項(xiàng)業(yè)務(wù)的迅速開(kāi)城;

  • 手機(jī)端和服務(wù)器的實(shí)時(shí)消息(包括接單,、搶單,、成單、通知,、計(jì)費(fèi)等)推送采用長(zhǎng)連接,;

  • 接口定義一套的新的數(shù)據(jù)協(xié)議,請(qǐng)求加密,,防token竊取,,請(qǐng)求防篡改;

  • 采用多級(jí)緩存方案,,數(shù)據(jù)庫(kù)、Redis,、MongoDB,、分布式本地緩存;

  • 引入分布式日志系統(tǒng)(重構(gòu)后期來(lái)不及加入,,只做了一部分,,但后期為此吃足苦頭,快的的兄弟們給了我們很大的幫助),;

  • 公共服務(wù)及業(yè)務(wù)服務(wù)的抽象及服務(wù)化,;

  • 南、北向接口分離,,南向接口主要對(duì)接外部供應(yīng)商,,北向接口僅指出租車(chē)部分,主要面向第三方渠道,、比如攜程,、去哪兒等。

  • 數(shù)據(jù)庫(kù)分庫(kù),、分表,、讀寫(xiě)分離;

  • 優(yōu)化尋找周邊司機(jī),,道路距離計(jì)算等算法,;

  • 上阿里云;

第一階段的服務(wù)化設(shè)計(jì)后的架構(gòu)圖,,大致如下:


上圖中大部分的設(shè)計(jì)都實(shí)現(xiàn)了,,并取得了不錯(cuò)的效果,但也埋了坑。其中訂單服務(wù)在重構(gòu)中期因?yàn)槌鲎廛?chē)業(yè)務(wù)的停止,,為了貪圖調(diào)用方便,,又把它合到專(zhuān)車(chē)核心服務(wù),后續(xù)在訂單量爆發(fā)的時(shí)候,,為此吃足苦頭,。出租車(chē)司機(jī)API也因?yàn)榉较騿?wèn)題停止維護(hù)。

在當(dāng)時(shí)的環(huán)境下,,重構(gòu)這樣的一個(gè)系統(tǒng)主要有這么幾大挑戰(zhàn):

1,、 時(shí)間不夠:項(xiàng)目計(jì)劃梳理需求和舊有系統(tǒng)邏輯2周,開(kāi)發(fā)&測(cè)試10周,,上線2周,,預(yù)計(jì)在7月底左右上線。

2,、 開(kāi)發(fā)資源嚴(yán)重不足:前線的還在繼續(xù)作戰(zhàn),,原來(lái)系統(tǒng)還需要有人留下做維護(hù)性開(kāi)發(fā),真正能抽出來(lái)做后端系統(tǒng)重構(gòu)的開(kāi)發(fā)人員只有5個(gè)(包括我),,4個(gè)Java開(kāi)發(fā),,1個(gè)PHP開(kāi)發(fā),其中有3個(gè)都是新招的開(kāi)發(fā)人員,。APP開(kāi)發(fā)也只有4個(gè)人參加重構(gòu),,同時(shí)負(fù)責(zé)iOS、Android,。

3,、 對(duì)公共模塊業(yè)務(wù)不熟悉:因?yàn)閷?zhuān)車(chē)系統(tǒng)是搭建在原出租車(chē)系統(tǒng)之上,所以大部分公共模塊都依賴(lài)出租車(chē)業(yè)務(wù),,而原出租車(chē)業(yè)務(wù)的開(kāi)發(fā)人員流動(dòng)比較大,,代碼也過(guò)了好幾手之后,留下來(lái)的人員對(duì)其業(yè)務(wù)細(xì)節(jié),,遺留代碼并不了解,,這將對(duì)后續(xù)的數(shù)據(jù)遷移留下很大隱患;

4,、業(yè)務(wù)復(fù)雜:如何設(shè)計(jì)一個(gè)靈活多變的專(zhuān)車(chē)系統(tǒng),,以適應(yīng)快節(jié)奏的運(yùn)營(yíng)策略。專(zhuān)車(chē)因?yàn)槠涮匦詻Q定了它的業(yè)務(wù)復(fù)雜多變,,隨便舉幾個(gè)例子:

  • 策略1:希望做接送機(jī)場(chǎng)訂單一口價(jià)的活動(dòng),,春節(jié)前,終點(diǎn)為虹橋/浦東機(jī)場(chǎng),,起點(diǎn)為全上海任意地區(qū)的,,可享受50/100元一口價(jià),,春節(jié)后,起/終點(diǎn)倒置,,為回程的乘客服務(wù),;

  • 策略2:當(dāng)某種車(chē)型不夠用時(shí),只有下機(jī)場(chǎng)單或者特定的好用戶時(shí)可以看到,;

  • 策略3:高峰期時(shí),,高級(jí)車(chē)型可以向下接單,但司機(jī)收入不變,,給搶單積極的司機(jī)更好的訂單,;

  • 希望在上海內(nèi)環(huán)以?xún)?nèi)做一口價(jià)活動(dòng),20元一口價(jià),,隨便打車(chē),,但司機(jī)價(jià)格會(huì)根據(jù)活動(dòng)情況分等級(jí)調(diào)整;

  • 策略4:好的預(yù)約訂單給搶單積極的司機(jī),,好的即時(shí)訂單給近的司機(jī),;

  • 策略5:多加一個(gè)專(zhuān)車(chē)產(chǎn)品,帶有嬰兒椅的車(chē)子,,女性乘客可以打到,;

  • 策略6:打一個(gè)專(zhuān)車(chē),如果時(shí)間超過(guò)2個(gè)小時(shí),,希望變成包車(chē)服務(wù),但價(jià)格要有給乘客優(yōu)惠,;

  • 策略7:我想讓某個(gè)起點(diǎn)的乘客享受費(fèi)用折扣,,甚至免單,但平臺(tái)按正常價(jià)格給司機(jī)計(jì)費(fèi),;

  • 策略8:每開(kāi)一個(gè)城市,,我想對(duì)機(jī)場(chǎng)、火車(chē)站的訂單實(shí)行一口價(jià)策略,;

  • 策略9:在某些城市,,有一部分司機(jī)是合作司機(jī),一部分加盟司機(jī),,兩者計(jì)費(fèi)規(guī)則完全不同,,需要滿足;

基本上,,這樣的策略每個(gè)月都有,,全國(guó)幾十個(gè)城市,每個(gè)城市可能還不同,,如果需要通過(guò)開(kāi)發(fā)來(lái)滿足這樣的需求,,那么幾百人的開(kāi)發(fā)團(tuán)隊(duì)都不夠用,,運(yùn)營(yíng)時(shí)間上也等不了。所以,,如何設(shè)計(jì)一個(gè)高可用,,靈活多變的系統(tǒng)來(lái)適應(yīng)業(yè)務(wù)的需求,這是一個(gè)非常大的挑戰(zhàn),。

5,、技術(shù)挑戰(zhàn):剩下還有就是一些技術(shù)上的挑戰(zhàn),比如快速搭建一套分布式服務(wù)框架,,如何快速找到周邊的司機(jī),、如何通過(guò)道路擬合比較準(zhǔn)確的計(jì)算道路距離、長(zhǎng)連接的QoS如何保證,、司乘兩端心跳上報(bào)異常如何處理,、如何防止心跳風(fēng)暴、規(guī)則引擎的性能優(yōu)化,、發(fā)單/搶單處理隊(duì)列的守護(hù)機(jī)制等,。

如何解決這幾個(gè)難題呢?

先說(shuō)開(kāi)發(fā)資源吧,,開(kāi)發(fā)資源屬于硬傷,,創(chuàng)業(yè)公司前期招人,招到好的人比較難,。業(yè)務(wù)等不了,,有句話說(shuō)的好“有條件上,沒(méi)有條件創(chuàng)造條件也要上”,,這就是當(dāng)時(shí)的情況,,人就這么多了,邊做邊招吧,,后面兩個(gè)多月我們陸陸續(xù)續(xù)招了六七個(gè)開(kāi)發(fā)人員,,但新招聘的大部分經(jīng)驗(yàn)還比較淺,但也基本上頂過(guò)去了,。

再說(shuō)到公共模塊,,當(dāng)我入職一周左右的時(shí)候我就知道系統(tǒng)必須大規(guī)模重構(gòu),但當(dāng)時(shí)因?yàn)榉N種因素提重構(gòu)必然會(huì)給業(yè)務(wù),、團(tuán)隊(duì)造成比較大的影響,,也會(huì)影響剛剛合并的團(tuán)隊(duì)信心,所以前期更多是花精力在整合團(tuán)隊(duì)和拖著專(zhuān)車(chē)系統(tǒng)往前走,。

公共模塊的代碼都是在出租車(chē)業(yè)務(wù)系統(tǒng),,向原來(lái)的開(kāi)發(fā)人員了解細(xì)節(jié)時(shí),被告知許多歷史遺留問(wèn)題已不可追遡,,只知道不要輕易去動(dòng),,一動(dòng)就崩,。于是,重構(gòu)計(jì)劃開(kāi)始后,,我挑了一個(gè)對(duì)原出租車(chē)業(yè)務(wù)比較了解的哥們,,拉著他兩個(gè)人慢慢翻PHP代碼,翻數(shù)據(jù)庫(kù)表,,通讀一遍,,才開(kāi)始抽象公共模塊及進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)。

其次,,說(shuō)到專(zhuān)車(chē)系統(tǒng)靈活多變的設(shè)計(jì),,我首先把專(zhuān)車(chē)業(yè)務(wù)的預(yù)估、選擇車(chē)型,、發(fā)單,、搶單、撮合,、做單,、計(jì)費(fèi)、通知等流程環(huán)節(jié)做了抽象,,并固化,,把可變的部分剝離。

  • 比如預(yù)估算價(jià),、顯示車(chē)型,、計(jì)費(fèi)時(shí)將司機(jī)和乘客完全分開(kāi),實(shí)際上在業(yè)務(wù)抽象的角度來(lái)看,,專(zhuān)車(chē)的乘客和司機(jī)發(fā)生的交易對(duì)象都不是對(duì)方,,而是平臺(tái),這樣就平臺(tái)在運(yùn)營(yíng)過(guò)程中就具備非常靈活主導(dǎo)權(quán),;

  • 比如消息通知模塊做了抽象,把不同階段消息體抽象成模板,,模板中帶有變量,,舉個(gè)最簡(jiǎn)單的例子:如參加某個(gè)活動(dòng)下單的用戶和普通下單用戶,在下單或計(jì)費(fèi)時(shí)收到的短信內(nèi)容不同,,但實(shí)際只是短信模板不同,,中間的價(jià)格用變量替換,有的甚至不發(fā)短信,;

  • 比如某些特定場(chǎng)景,,第一輪發(fā)單不希望發(fā)給某類(lèi)司機(jī),要第二,、三輪才發(fā)給他,,撮合成單時(shí)也根據(jù)不同維度的指標(biāo)進(jìn)行排序定義,;

  • 比如將優(yōu)惠券可用在不同業(yè)務(wù)場(chǎng)景定義成模板,再模板上增加Scope,,Scope又反作用到產(chǎn)品上面,;

  • 比如,對(duì)專(zhuān)車(chē)運(yùn)營(yíng)中最經(jīng)常發(fā)生變化的預(yù)估,、可見(jiàn)車(chē)型,、發(fā)單、搶單,、撮合邏輯,,通過(guò)將乘客和司機(jī)的特征指標(biāo)抽象,這個(gè)乘客,、司機(jī),、訂單三個(gè)緯度的特征指標(biāo)抽象很關(guān)鍵,在后期和大數(shù)據(jù)結(jié)合,,也可以將乘客司機(jī)的畫(huà)像指標(biāo)引入,,再利用規(guī)則引擎來(lái)配置每個(gè)環(huán)節(jié)的變化,見(jiàn)下圖:


    在將以上所有這些靈活配置的內(nèi)容之上,,又定義了大小產(chǎn)品的概念,,把這些靈活多變的配置參數(shù)抽象成一個(gè)個(gè)產(chǎn)品,每個(gè)產(chǎn)品維護(hù)這些配置的參數(shù)或規(guī)則,,從而達(dá)到運(yùn)營(yíng)策略和運(yùn)行系統(tǒng)的隔離,,實(shí)現(xiàn)了一套靈活的專(zhuān)車(chē)業(yè)務(wù)系統(tǒng)。

這些產(chǎn)品對(duì)應(yīng)給乘客看到的其實(shí)是一個(gè)個(gè)車(chē)型,,但看起來(lái)同樣是經(jīng)濟(jì)型的車(chē),,在后臺(tái)根據(jù)不同的條件已經(jīng)被抽象配置成不同的定義規(guī)則,如機(jī)場(chǎng)訂單的經(jīng)濟(jì)型和非機(jī)場(chǎng)的經(jīng)濟(jì)型就完全是不同的業(yè)務(wù)規(guī)則,,無(wú)論從預(yù)估的價(jià)格,、發(fā)單、搶單,、撮合,、通知等都完全不同。

這樣的設(shè)計(jì)在重構(gòu)上線后,,業(yè)務(wù)系統(tǒng)大框架在兩年時(shí)間基本沒(méi)有動(dòng)過(guò),,最多是增加為一些新的指標(biāo)或者函數(shù)進(jìn)行開(kāi)發(fā),但不會(huì)影響主流程,,業(yè)務(wù)系統(tǒng)的架構(gòu)非常穩(wěn)定,。

市場(chǎng)部門(mén)或是業(yè)務(wù)部門(mén)要上線一個(gè)新的運(yùn)營(yíng)策略,比如一號(hào)專(zhuān)車(chē)在2015年和Uber打戰(zhàn)的時(shí)候,,上線一號(hào)快車(chē),,在研發(fā)部門(mén)實(shí)際只用了兩天就已經(jīng)配置測(cè)試完畢,,為了配合運(yùn)營(yíng)的工作,才拖了一周才上線,。

限于篇幅因素,,技術(shù)細(xì)節(jié)這里就不再多說(shuō),給大家看一個(gè)最小片段的機(jī)場(chǎng)單的產(chǎn)品命中規(guī)則

( 單v城市 ==1 ) && ( 函v電子圍欄 (單v目的地,上海浦東機(jī)場(chǎng)) ) && ( 單v渠道 ==0 || 單v渠道 ==1 || 單v渠道 ==201 ) && ( 單v類(lèi)型 ==2 )&&( 單v入口 == 0 )&& !((單v用車(chē)時(shí)長(zhǎng)>=1)&&(客v版本號(hào)>=4))&&(單v回調(diào)碼==0)

題外話:在一次偶然的機(jī)會(huì),,和行業(yè)內(nèi)的各家專(zhuān)車(chē)系統(tǒng)對(duì)標(biāo)時(shí),,發(fā)現(xiàn)一號(hào)專(zhuān)車(chē)這種系統(tǒng)設(shè)計(jì)和Uber的設(shè)計(jì)思路非常類(lèi)似,所以Uber才可以讓各城市經(jīng)理在不同城市開(kāi)通不同車(chē)型做各種各樣的活動(dòng),,Uber系統(tǒng)應(yīng)該是經(jīng)歷了數(shù)年演化,,而一號(hào)系統(tǒng)重構(gòu)頭尾只花了2個(gè)多月,實(shí)際上一號(hào)的指標(biāo)維度非常多,,有些甚至用自定義函數(shù)來(lái)組合使用一個(gè)指標(biāo),,因?yàn)閲?guó)內(nèi)的運(yùn)營(yíng)策略變化實(shí)在太快太多了。殊途同歸吧,。

最后再說(shuō)到時(shí)間,、時(shí)間….時(shí)間啊,!上面提的許多技術(shù)問(wèn)題,,如果從時(shí)間的維度上考慮,根本就不是問(wèn)題,,什么GPS距離計(jì)算算法不準(zhǔn),、去噪及道路擬合算法不夠優(yōu)、流控還沒(méi)有做,、長(zhǎng)連接服務(wù)質(zhì)量不好,、SQL慢查優(yōu)化,給我們時(shí)間,,統(tǒng)統(tǒng)都不是問(wèn)題,。重構(gòu)計(jì)劃是4月9號(hào)開(kāi)始, 我們?cè)陂喿x舊有代碼,、梳理業(yè)務(wù),、設(shè)計(jì)新的數(shù)據(jù)庫(kù)結(jié)構(gòu)、搭建團(tuán)隊(duì),、搭A(yù)PI接口層框架,、搭分布式服務(wù)架構(gòu)(Thrift + ZK + DHF SRV Framework + Chukwa[實(shí)際沒(méi)用起來(lái)])的過(guò)程中,,很快就到了5月1號(hào),。

勞動(dòng)節(jié)后,第一波炸彈來(lái)襲,,聽(tīng)說(shuō)其他幾家打車(chē)應(yīng)用也在做專(zhuān)車(chē),,天下武功,,唯快不破,我們必須最先上線,,于是計(jì)劃調(diào)整改到7.15上線,,下了死命令,好吧,,干吧,,需求不能變,時(shí)間變了,! 臨近5月中旬,,新的需求來(lái)了,要求我們直接和快的打車(chē)端對(duì)接,,至少要在重構(gòu)上線后兩周內(nèi)也上,,沒(méi)有辦法,在打車(chē)領(lǐng)域競(jìng)爭(zhēng)的激烈程度超出所有的想象,,業(yè)務(wù)發(fā)展的速度都是按天算的,。

于是我們把上線時(shí)間又提前到6.15,并計(jì)劃6.30上線快的APP端的一號(hào)專(zhuān)車(chē),,時(shí)間,,還是時(shí)間,需要提前梳理對(duì)接流程,、接口定義及開(kāi)發(fā),,人呢?時(shí)間呢,?好吧,,繼續(xù)干吧!沒(méi)有抱怨,,也不談夢(mèng)想,、更沒(méi)有什么改造世界的想法,僅僅是一份信任,、一個(gè)承諾,,整個(gè)重構(gòu)團(tuán)隊(duì)日夜加班,從4月9號(hào)計(jì)劃啟動(dòng),,到6月18號(hào)上線,,連續(xù)70天沒(méi)有休息一天,前后端的重構(gòu)團(tuán)隊(duì)都是全公司來(lái)得最早走得最晚的人,,終于還是讓系統(tǒng)上了線,。PS:苦過(guò)笑過(guò),留下的都是許多歡樂(lè)回憶,當(dāng)值得書(shū)寫(xiě)留念,。

上線前一天

上線前一天,,雖然已經(jīng)預(yù)演過(guò)兩次,但大家心里都沒(méi)有底,,因?yàn)閷?zhuān)車(chē)業(yè)務(wù)量剛剛起來(lái),,系統(tǒng)如果真的出問(wèn)題,將會(huì)給對(duì)手們一個(gè)絕佳的機(jī)會(huì),。內(nèi)部在討論的時(shí)候,,問(wèn)的最多的一個(gè)問(wèn)題是如果系統(tǒng)掛了,我們有什么預(yù)案,,做了兩套,,一套是切回老系統(tǒng),但會(huì)出現(xiàn)新舊數(shù)據(jù)不一致的問(wèn)題,,后續(xù)補(bǔ)數(shù)據(jù)非常麻煩,;再一套是需要運(yùn)營(yíng)的兄弟們支持,系統(tǒng)只記錄下單信息,,然后出后臺(tái)報(bào)表,,由運(yùn)營(yíng)同學(xué)手工派單,再打電話通知乘客和司機(jī)接送,,回到原始社會(huì),,這就是現(xiàn)實(shí)。

通宵不眠,,遷移當(dāng)天增量數(shù)據(jù),、服務(wù)上線、回歸驗(yàn)證,、強(qiáng)制升級(jí),,深更半夜,運(yùn)營(yíng)同事們也開(kāi)著車(chē)在路上晃蕩著幫忙路測(cè),,悅耳的新訂單鈴聲,,成單播報(bào)不停響起,終于熬過(guò)去了,。

系統(tǒng)上線:快樂(lè)并痛著

系統(tǒng)剛上線,,基本的業(yè)務(wù)流程雖然沒(méi)有出什么大問(wèn)題,但隨著訂單量的迅猛增長(zhǎng),,迅速開(kāi)城,,業(yè)務(wù)變化,各種狀況層出不窮:

  • 長(zhǎng)連接QoS沒(méi)有做好,,訂單撮合成功,,但司機(jī)或乘客卻沒(méi)有收到推送通知,;

  • 司機(jī)行駛距離根據(jù)GPS+WIFI+基站三種制式的GPS坐標(biāo)值,去噪算法做得不夠好,,計(jì)算出來(lái)的距離差異巨大;

  • 定位不準(zhǔn),,司機(jī)有意或無(wú)意沒(méi)有開(kāi)GPS,、網(wǎng)絡(luò),導(dǎo)致發(fā)單距離太遠(yuǎn),;

  • 訂單量上來(lái),,索引不夠優(yōu)化,慢查SQL層出不窮,,數(shù)據(jù)庫(kù)CPU百分百,;

  • 當(dāng)時(shí)上的是阿里云,阿里云的數(shù)據(jù)庫(kù)專(zhuān)家在監(jiān)控應(yīng)用的時(shí)候,,曾經(jīng)給過(guò)一份數(shù)據(jù)庫(kù)的診斷報(bào)告,,非常客觀的將我們數(shù)據(jù)庫(kù)的問(wèn)題類(lèi)比成某寶08,、09年的狀態(tài),,慚愧;

  • 代碼沒(méi)有Review,,小分支的邏輯測(cè)試不到位,,出現(xiàn)死循環(huán),拖垮系統(tǒng),;

  • 當(dāng)日訂單超過(guò)10W的時(shí)候,,司機(jī)做單時(shí)上報(bào)的心跳對(duì)后臺(tái)存儲(chǔ)(MongoDB、數(shù)據(jù)庫(kù))壓力過(guò)大,;

  • 因時(shí)間問(wèn)題,,日志系統(tǒng)沒(méi)有上線,在跨服務(wù)的應(yīng)用中,,無(wú)法實(shí)時(shí)監(jiān)控各服務(wù)運(yùn)行異常并及時(shí)告警,,為此付出很大代價(jià);

  • Redis在日訂單過(guò)百萬(wàn)后,,也扛不住壓力了,;

一方面前方捷報(bào)不斷,另一方面后方銷(xiāo)煙彌漫,,快樂(lè)并痛著,,不停的發(fā)布新版本,修復(fù)BUG,,優(yōu)化系統(tǒng),,出現(xiàn)過(guò)好幾次系統(tǒng)大規(guī)模宕機(jī),大部分都是因?yàn)楦鞣N因素(不僅限于慢查)導(dǎo)致數(shù)據(jù)庫(kù)不堪重負(fù)引起連鎖反應(yīng),在訂單過(guò)百萬(wàn)之后更是連續(xù)一周的時(shí)間,,在每天的晚下班高峰期系統(tǒng)負(fù)載扛不住,,當(dāng)然后來(lái)在前后端團(tuán)隊(duì)通力合作下,都順利優(yōu)化頂過(guò)去了,,大致回想一下,,挑一些簡(jiǎn)單的列一下:

  • 優(yōu)化道路距離優(yōu)化算法;PS:高德地圖的兄弟給了許多幫助,;

  • 所有道路距離計(jì)算只取GPS,,基站及WIFI獲取的點(diǎn)不做為道路計(jì)算使用,但聽(tīng)單可以使用WIFI的GPS點(diǎn),;

  • 優(yōu)化尋找周邊司機(jī)算法,;

  • 提升長(zhǎng)連接的通訊服務(wù)質(zhì)量,在移動(dòng)環(huán)境下網(wǎng)絡(luò)不穩(wěn),,需要雙向確認(rèn)及心跳包客戶端打包機(jī)制,;

  • 服務(wù)繼續(xù)拆分;

  • 數(shù)據(jù)庫(kù)分庫(kù),、分表,、一主多從、讀寫(xiě)分離,;

  • 多級(jí)緩存,,優(yōu)化緩存的使用,數(shù)據(jù)庫(kù)只做存儲(chǔ),,如Redis Sharding分Memory和Persistence兩類(lèi)等,;

  • 設(shè)計(jì)了兩層的限流熔斷方案、服務(wù)降級(jí)策略等,;

  • 舊的SQL全量Review,,新SQL必須DBA確認(rèn)后方可上線;

  • APP端也優(yōu)化了訪問(wèn)策略,;

  • 加上日志監(jiān)控系統(tǒng),,監(jiān)控系統(tǒng)整體運(yùn)行狀況;Ps:感謝快的兄弟們的支持,;

  • 增加服務(wù)器,,這一點(diǎn)我們做得不錯(cuò),使用了不到一百臺(tái)的4核*2.8G CPU,,16G內(nèi)存的服務(wù)節(jié)點(diǎn),,就挺過(guò)了數(shù)百萬(wàn)單的業(yè)務(wù),且每個(gè)服務(wù)結(jié)點(diǎn)的資源消耗都在個(gè)位數(shù),;

還有很多細(xì)節(jié)已經(jīng)回憶不起來(lái),,歡迎大家后續(xù)多交流,。

一號(hào)專(zhuān)車(chē)的重構(gòu)其實(shí)是重寫(xiě),在業(yè)務(wù)不停往前奔跑的過(guò)程中,,重寫(xiě)是下策,,風(fēng)險(xiǎn)很高,要慎而又慎,,好在當(dāng)時(shí)的訂單量還不大,。大部分時(shí)候,系統(tǒng)重構(gòu)應(yīng)該盡量要在充分了解業(yè)務(wù)的基礎(chǔ)上,,采用分而治之,分階段進(jìn)步的方式來(lái),,開(kāi)著飛機(jī)換引擎還好,,但我見(jiàn)過(guò)開(kāi)著飛機(jī)換飛機(jī)的重構(gòu)計(jì)劃,著實(shí)為對(duì)方捏一把冷汗,,不知道最后結(jié)果如何了,?當(dāng)然,如果決定要?jiǎng)邮?,那還是越早做越好了,。

后序

以上行文僅做為系統(tǒng)重構(gòu)的技術(shù)回顧,重構(gòu)過(guò)程艱難而痛苦,,它不僅限于技術(shù)層面的難度,。此后的過(guò)程中系統(tǒng)挺過(guò)了一輪又一輪浪峰的沖擊,也逐漸趨于穩(wěn)定,,基本上算是完成了組織交給我的任務(wù),。

2015年底,Joe開(kāi)始了他的新項(xiàng)目——四葉草車(chē)險(xiǎn),,開(kāi)始了另外一次從0到1的挑戰(zhàn)之旅,,他再次邀請(qǐng)了我,我于2015年12月31日離開(kāi)滴滴快的,,加入四葉草車(chē)險(xiǎn)平臺(tái)參與互聯(lián)網(wǎng)保險(xiǎn)的創(chuàng)業(yè)項(xiàng)目,。

這一次挑戰(zhàn)更大,保險(xiǎn)業(yè)在中國(guó)是一個(gè)萬(wàn)億級(jí)的市場(chǎng),。據(jù)了解,,國(guó)內(nèi)的比較大的傳統(tǒng)保險(xiǎn)公司,一家公司往往都有三,、四百個(gè)系統(tǒng)在支撐業(yè)務(wù)運(yùn)轉(zhuǎn),。保險(xiǎn)未來(lái)的變化極其復(fù)雜多樣,我們才剛剛開(kāi)始,,未來(lái)還要迎接諸多挑戰(zhàn),,在這個(gè)過(guò)程中,,我們需要更多的人才加入,來(lái)和我們一起體驗(yàn)新的重構(gòu)之痛(le),。說(shuō)句老套的話,,我們可以提供業(yè)界有競(jìng)爭(zhēng)力的薪資以及和團(tuán)隊(duì)一起戰(zhàn)斗成長(zhǎng)的經(jīng)驗(yàn)。

作者介紹

陳美珍(Frank),,微信號(hào)zhaocaimaolin,,12年的軟件研發(fā)以及技術(shù)管理經(jīng)驗(yàn)。擅長(zhǎng)互聯(lián)網(wǎng)的高并發(fā),、高可用的分布式系統(tǒng)架構(gòu)設(shè)計(jì),,組建并帶領(lǐng)團(tuán)隊(duì)完成項(xiàng)目的訂單從零到數(shù)百萬(wàn)量級(jí)的突破。對(duì)大中型復(fù)雜系統(tǒng)的需求分析,、抽象,、架構(gòu)設(shè)計(jì)、拆分,、服務(wù)化設(shè)計(jì)及整合也比較擅長(zhǎng),,有多年證券、電信等傳統(tǒng)業(yè)務(wù)系統(tǒng)實(shí)戰(zhàn)經(jīng)驗(yàn),。

目前我們需要各個(gè)技術(shù)崗位的人才,,歡迎有意向的朋友聯(lián)系。來(lái)我們團(tuán)隊(duì)工作,,有一點(diǎn)是可以保證,,一定會(huì)讓你的工作經(jīng)歷是快樂(lè)而豐富的!簡(jiǎn)歷投遞郵箱: [email protected],,歡迎加入,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多