日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
聊聊我與流式計(jì)算的故事

聊聊流式計(jì)算吧 , 那一段經(jīng)歷于我而言很精彩,很有趣,想把這段經(jīng)歷分享給大家。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),個(gè)舊企業(yè)網(wǎng)站建設(shè),個(gè)舊品牌網(wǎng)站建設(shè),網(wǎng)站定制,個(gè)舊網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,個(gè)舊網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

1 背景介紹

2014年,我在藝龍旅行網(wǎng)促銷團(tuán)隊(duì)負(fù)責(zé)紅包系統(tǒng)。

彼時(shí),促銷大戰(zhàn)如火如荼,優(yōu)惠券計(jì)算服務(wù)也成為藝龍促銷業(yè)務(wù)中最重要的服務(wù)之一。

而優(yōu)惠券計(jì)算服務(wù)正是采用當(dāng)時(shí)大名鼎鼎的流式計(jì)算框架 Storm。

流式計(jì)算是利用分布式的思想和方法,對(duì)海量“流”式數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的系統(tǒng),它源自對(duì)海量數(shù)據(jù)“時(shí)效”價(jià)值上的挖掘訴求。

優(yōu)惠券計(jì)算服務(wù)的邏輯是:每個(gè)城市每個(gè)酒店的使用優(yōu)惠券的規(guī)則并不相同,當(dāng)運(yùn)營(yíng)人員修改規(guī)則之后,觸發(fā)優(yōu)惠券計(jì)算服務(wù),計(jì)算完成之后,用戶下單時(shí)在使用優(yōu)惠券時(shí)會(huì)呈現(xiàn)最新的規(guī)則。

優(yōu)惠券計(jì)算服務(wù)是我們團(tuán)隊(duì)的明星項(xiàng)目,很多研發(fā)的同學(xué)都對(duì) Storm 特別感興趣 ,  因?yàn)?Storm 的核心開發(fā)語(yǔ)言是 clojure , 比較小眾。

于是,在團(tuán)隊(duì)內(nèi)部,發(fā)現(xiàn)一個(gè)很有趣的現(xiàn)象:很多同學(xué)的辦公桌上放著《clojure in  Action 》這本書。

clojure in  Action

藝龍開始發(fā)力移動(dòng)互聯(lián)網(wǎng),業(yè)務(wù)量的激增,優(yōu)惠券計(jì)算服務(wù)開始遇到了瓶頸。

比如運(yùn)營(yíng)人員修改全量規(guī)則時(shí),整個(gè)計(jì)算流程要耗時(shí)一上午,也就談不上實(shí)時(shí)計(jì)算了。

CTO 幾次找團(tuán)隊(duì)負(fù)責(zé)人,并嚴(yán)厲批責(zé)成他盡快優(yōu)化。經(jīng)過一個(gè)半月幾次優(yōu)化,系統(tǒng)的瓶頸依然明顯,時(shí)不時(shí)運(yùn)營(yíng)同事會(huì)走到我們的工位附近,催促我們:“系統(tǒng)生效了么?”

我并不負(fù)責(zé)計(jì)算服務(wù),每當(dāng)同事被質(zhì)疑時(shí),我都感到很疑惑:“優(yōu)惠券計(jì)算服務(wù)真的那么復(fù)雜嗎?” , 同時(shí)也躍躍欲試:“ Storm 真有那么難搞嗎?”

我心中暗暗下定了決心,一定要弄清楚優(yōu)惠券計(jì)算服務(wù)的邏輯 。

2 國(guó)圖學(xué)習(xí)

北京有很多景點(diǎn)都讓我流連忘返,比如史鐵生小說里的地壇,滿山楓葉的香山,如詩(shī)如畫的頤和園,美侖美奐的天壇 。

在我心里,有一處很神圣的地方,它是知識(shí)和希望的象征,那就是國(guó)家圖書館 。

中國(guó)國(guó)家圖書館位于北京市中關(guān)村南大街33號(hào),與海淀區(qū)白石橋高粱河、紫竹院公園相鄰。它是國(guó)家總書庫(kù),國(guó)家書目中心,國(guó)家古籍保護(hù)中心,同時(shí)也是世界最大、最先進(jìn)的國(guó)家圖書館之一 。

每到周末,當(dāng)我想安靜下來,專注思考時(shí),我就會(huì)背著筆記本電腦來到國(guó)家圖書館。

選擇自己喜歡的書,然后將筆記本電腦打開,一邊看書,一邊在電腦上寫點(diǎn)筆記。

偶爾抬起頭,望著那些正在閱讀的讀者,心里面感覺很陽(yáng)光,覺得生命充滿了希望。

想要揭開 Storm 神秘面紗的探索欲,同時(shí)探尋優(yōu)惠券計(jì)算服務(wù)為什么會(huì)這么慢的渴望,讓我好幾天晚上沒睡好。

于是周六上午9點(diǎn)半, 我來到國(guó)家圖書館 ,想讓自己安靜下來,思考如何解決這個(gè)問題。解決問題的快感,是我一直追求的。

當(dāng)我把筆記本電腦放平在桌上,我很興奮,同時(shí)靈臺(tái)一片澄清:優(yōu)惠券計(jì)算服務(wù)的核心是 Storm ,那么我需要先了解 Storm 的整體概念

打開官網(wǎng),瀏覽官網(wǎng)的文檔,第一次看到 Storm 的邏輯流程圖時(shí), 做為程序員,我第一次竟然感受到抽象之美:從源頭流下來的水通過水龍頭( Spout ),再經(jīng)過層層轉(zhuǎn)接頭( Bolt )過濾,不就是我們想要的純凈水嗎?

storm邏輯圖,已授權(quán)

其實(shí)我們?cè)瓉矶际?nbsp;CRUD boy ,機(jī)械的使用那些框架,只會(huì)做增刪改查,并不會(huì)思考框架背后的設(shè)計(jì)思路。但框架到底是什么?從來沒有思考過。我一直覺得我很笨拙,學(xué)什么都很慢,但那一刻我突然恍然大悟:框架本身是將解決問題的思路抽象化,從而便于研發(fā)人員使用,把復(fù)雜的問題抽象成有美感,是需要功底的。

了解完 Storm 整體概念 , 下一步也就是大家熟知的寫 Hello  World 階段了 。

我參考教程寫了一個(gè)簡(jiǎn)單的 Storm 應(yīng)用(簡(jiǎn)稱:拓?fù)洌?,在部署后,程序正常跑了起來?/p>

我腦海里一直有一個(gè)疑問:“是不是優(yōu)惠券計(jì)算服務(wù)的 storm 集群的配置沒有調(diào)優(yōu),才導(dǎo)致計(jì)算的性能太差 ? ”  所以我必須去理解 storm 的并發(fā)度是如何計(jì)算的。

整個(gè)下午,我一直在查閱相關(guān)的資料,并結(jié)合下圖思考:Nimbus, Supervisor ,Worker ,Task  這些名詞到底是什么概念,以及他們之間是如何交互的。

進(jìn)而思考:拓?fù)涞降讜?huì)啟動(dòng)幾個(gè)進(jìn)程,每個(gè)進(jìn)程內(nèi)部線程模型是怎樣的,頗有些庖丁解牛的味道。

這個(gè)習(xí)慣一直保持到現(xiàn)在,當(dāng)我看到一個(gè)系統(tǒng),我會(huì)下意思的去思考:“這個(gè)系統(tǒng)的線程模型如何,每次操作有哪些線程參于,他們之間如何交互”。我知道有更厲害的大牛,運(yùn)行一行代碼就知道 CPU 會(huì)運(yùn)行的哪些指令,我做不到,但我覺得那就更加深刻了。

不管怎樣,這一天,我的思緒經(jīng)過多次的變化,興奮,猶疑,放棄,陽(yáng)光,激動(dòng),畏難心理一直存在,很多次想放棄,但好奇心一直鼓勵(lì)著我。

等天色已黑,我走出國(guó)圖的大門,腦子里全部都是 Storm 進(jìn)程,線程模型,內(nèi)心里面,有了莫名的自信。感覺自己就像仙劍奇?zhèn)b傳里的酒劍仙,伴隨著激昂的 BGM ,拔劍四顧,斬妖除魔。

御劍乘風(fēng)來,除魔天地間,有酒樂逍遙,無酒我亦癲。

一飲盡江河,再飲吞日月,千杯醉不倒,唯我酒劍仙。

3 找到瓶頸

當(dāng)我理解了 Storm 的整體概念,接下來我需要去找到優(yōu)惠券計(jì)算服務(wù)的性能瓶頸。這個(gè)時(shí)候,梳理計(jì)算服務(wù)整體流程非常關(guān)鍵。

優(yōu)惠券流式計(jì)算拓?fù)?/p>

計(jì)算服務(wù)整體流程分為三個(gè)步驟 :

  1. 抽取數(shù)據(jù):酒店信息拉取服務(wù)拉取酒店信息,并存儲(chǔ)到水源頭( Redis A/B 集群 ) ;
  2. 計(jì)算過程:Storm 拓?fù)?/strong>從水源頭獲取酒店數(shù)據(jù),通過運(yùn)營(yíng)配置的規(guī)則對(duì)數(shù)據(jù)進(jìn)行清洗 ,將計(jì)算好的數(shù)據(jù)存儲(chǔ)到水存放池 ( Redis C 集群) ;
  3. 入庫(kù)階段:入庫(kù)服務(wù)水存放池獲取數(shù)據(jù),將計(jì)算結(jié)果存儲(chǔ)到數(shù)據(jù)庫(kù) 。

當(dāng)我們把整個(gè)計(jì)算的過程拆分成 抽取-->計(jì)算 --> 存儲(chǔ) 三個(gè)階段的時(shí)候,計(jì)算服務(wù)的架構(gòu)就變得異常清晰,那到底在哪個(gè)階段最耗時(shí) ,也成為我追查的目標(biāo)。

優(yōu)惠券計(jì)算服務(wù)當(dāng)時(shí)沒有詳細(xì)的性能監(jiān)控體系,所以我只能先從日志著手。在運(yùn)營(yíng)同事觸發(fā)全量計(jì)算后,分別觀察三個(gè)階段對(duì)應(yīng)服務(wù)的日志:

  • 抽取數(shù)據(jù):酒店信息拉取服務(wù)
  • 計(jì)算過程:   Storm 拓?fù)?/strong>
  • 入庫(kù)階段:   入庫(kù)服務(wù)

令人驚訝的現(xiàn)象:一次全量計(jì)算需要耗時(shí)4個(gè)多小時(shí),但抽取數(shù)據(jù)的任務(wù)竟然跑了2個(gè)多小時(shí),和我預(yù)期完全不一樣。

假如我把酒店信息拉取服務(wù)比作抽水泵,那么整個(gè)系統(tǒng)最大的問題竟然是抽水泵抽水馬力不足。

4 推進(jìn)重構(gòu)

為什么抽水泵抽水馬力不足 ?

通過閱讀源碼,我發(fā)現(xiàn)因?yàn)榫€程模型不夠好,應(yīng)用在部署多個(gè)節(jié)點(diǎn)后,每個(gè)節(jié)點(diǎn)只能有兩個(gè)線程執(zhí)行拉取酒店信息。

怎么處理呢?在原有代碼上優(yōu)化可行嗎?好像也不太容易,因?yàn)槔洗a最初是一個(gè) C# 研發(fā)同事寫的,他當(dāng)時(shí)也不熟悉 JAVA ,從設(shè)計(jì)層面來講,有很多冗余且不合理的代碼,而且經(jīng)過3年左右的維護(hù),代碼老化嚴(yán)重,于是我只能想到重構(gòu)。

當(dāng)我把想法和團(tuán)隊(duì)負(fù)責(zé)人溝通后,他有點(diǎn)半信半疑,他認(rèn)為我的判斷沒有問題,但不確定我是否可以將系統(tǒng)重構(gòu)好。我那時(shí)候信心爆棚,主動(dòng)請(qǐng)纓,打包票不會(huì)出問題的。可能是由于 CTO 逼的太緊了,他同意了。

在重構(gòu)之前,梳理好系統(tǒng)的整體邏輯。

酒店拉取服務(wù)邏輯圖

重構(gòu)的重點(diǎn)原則有兩條:

  1. 拉取服務(wù)可水平擴(kuò)展,若性能不足時(shí),增加服務(wù)節(jié)點(diǎn)即可提升性能;
  2. 配置文件可配置 worker 線程數(shù)量。

那思想層面,我已經(jīng)做好準(zhǔn)備了,那硬實(shí)力層面我有沒有做好準(zhǔn)備嗎?非常自信的講,準(zhǔn)備好了,因?yàn)?strong>我遇到了 RocketMQ 。

我在《我與消息隊(duì)列的8年情緣》這篇文章寫到:

2014年,我搜羅了很多的淘寶的消息隊(duì)列的資料,我知道MetaQ的版本已經(jīng)升級(jí)MetaQ 3.0,只是開源版本還沒有放出來。

大約秋天的樣子,我加入了RocketMQ技術(shù)群。誓嘉(RocketMQ創(chuàng)始人)在群里說:“最近要開源了,放出來后,大家趕緊fork呀”。他的這句話發(fā)在群里之后,群里都炸開了鍋。我更是歡喜雀躍,期待著能早日見到阿里自己內(nèi)部的消息中間件。

終于,RocketMQ終于開源了。我迫不及待想一窺他的風(fēng)采。

因?yàn)槲蚁雽W(xué)網(wǎng)絡(luò)編程,而RocketMQ的通訊模塊remoting底層也是Netty寫的。所以,RocketMQ的通訊層是我學(xué)習(xí)切入的點(diǎn)。

我模仿RocketMQ的remoting寫了一個(gè)玩具的rpc,這更大大提高我的自信心。正好,藝龍舉辦技術(shù)創(chuàng)新活動(dòng)。我想想,要不嘗試一下用Netty改寫下Cobar的通訊模塊。于是參考Cobar的源碼花了兩周寫了個(gè)netty版的proxy,其實(shí)非常粗糙,很多功能不完善。后來,這次活動(dòng)頒給我一個(gè)鼓勵(lì)獎(jiǎng),現(xiàn)在想想都很好玩。

在重構(gòu)酒店信息拉取服務(wù)時(shí),我將 RocketMQ 如何創(chuàng)建線程的知識(shí)點(diǎn)正好也用了上去,并學(xué)習(xí)如何將模塊拆分得更加合理。同時(shí)在重構(gòu)過程中,不斷 Review 新老代碼的差別,確保核心邏輯正確。

非常幸運(yùn),大概一周時(shí)間,我就重構(gòu)完了。

重構(gòu)完成并不意味著結(jié)束,怎么驗(yàn)證呢  ?我當(dāng)時(shí)采取了兩種方式:

  • 代碼評(píng)審
    我拉著優(yōu)惠券計(jì)算服務(wù)的同事,一起 review 代碼 。整個(gè)過程,大家也并沒有提出異議,并對(duì)我創(chuàng)建線程的技巧感到很好奇。我心中竊喜:”那是學(xué)習(xí) RocketMQ 的“。
  • 測(cè)試環(huán)境數(shù)據(jù)驗(yàn)證
    我們將新舊兩版服務(wù)同時(shí)觸發(fā),比對(duì)兩個(gè)版本的數(shù)據(jù)的異同,將比對(duì)結(jié)果輸出到日志文件,然后從中找到差異的地方,修復(fù)重構(gòu)版的 BUG 。然后在測(cè)試環(huán)境部署重構(gòu)版,觀察一段時(shí)間,確保無異常。

從編寫第一行代碼,三周時(shí)間,重構(gòu)版終于上線了。我將原來的老服務(wù)替換后,部署了3個(gè)節(jié)點(diǎn), 每個(gè)節(jié)點(diǎn)8個(gè)worker 并行拉取酒店信息 。

令人開心和激動(dòng)的是,重構(gòu)是非常成功的。因?yàn)闃I(yè)務(wù)給我們的時(shí)間需求也是1個(gè)小時(shí)左右。一次全量計(jì)算從原來4個(gè)小時(shí)急速縮減到1小時(shí)15分鐘,整個(gè)酒店拉取服務(wù)耗時(shí)40分鐘左右。

我心里長(zhǎng)舒一口氣,內(nèi)心吟誦李白的詩(shī):"十步殺一人,千里不留行。事了拂衣去,深藏身與名。"

5 向前一步

前 Facebook COO 謝麗爾·桑德伯格寫了一本書《向前一步》,我特別喜歡這本書的書名 。

在優(yōu)化優(yōu)惠券計(jì)算服務(wù)的前期,團(tuán)隊(duì)經(jīng)過一個(gè)多月的時(shí)間,也沒有什么成效。我自己也猶豫:”我能不能解決這個(gè)問題?“ ,但最終我還是向前一步,并幫助團(tuán)隊(duì)大大提升了服務(wù)的性能,負(fù)責(zé)人也有了信心,他也敢投入資源優(yōu)化Storm 拓?fù)?/strong>和入庫(kù)流程。

在閱讀優(yōu)惠券計(jì)算服務(wù)的代碼中,我發(fā)現(xiàn)兩個(gè)問題:

  1. 流式計(jì)算邏輯中有大量網(wǎng)絡(luò) IO 請(qǐng)求,主要是查詢特定的酒店數(shù)據(jù),用于后續(xù)計(jì)算;
  2. 每次計(jì)算時(shí)需要查詢基礎(chǔ)配置數(shù)據(jù),它們都是從數(shù)據(jù)庫(kù)中獲取。

對(duì)于Storm 拓?fù)鋬?yōu)化,我提了兩點(diǎn)建議:

  1. 流式計(jì)算拓?fù)浜途频昀》?wù)各司其職,將流式計(jì)算中的網(wǎng)絡(luò) IO 請(qǐng)求挪到酒店拉取服務(wù),將數(shù)據(jù)前置準(zhǔn)備好;
  2. 基礎(chǔ)配置緩存化,引入讀寫鎖(也是 RocketMQ 名字服務(wù)的技巧)。

對(duì)于入庫(kù)流程,一位研發(fā)同學(xué)將原來的單條數(shù)據(jù)入庫(kù)修改成批量入庫(kù)。

經(jīng)過大家一起努力 ,優(yōu)惠券計(jì)算服務(wù)的整體性能大大提升了,全量計(jì)算耗時(shí)已經(jīng)變成40分鐘了,再也不會(huì)有運(yùn)營(yíng)同事在我們的工位附近吐槽系統(tǒng)慢了。

6 寫到最后

2014年,我向前一步推動(dòng)了公司流式計(jì)算服務(wù)的優(yōu)化,并取得了一點(diǎn)點(diǎn)進(jìn)步。

時(shí)光荏苒,我已中年,生命中遇到越來越多的挫折,有的時(shí)候也會(huì)讓人低落,但每當(dāng)想起這個(gè)故事,我會(huì)深深感動(dòng)于當(dāng)時(shí)的一往無前。

當(dāng)再次面臨選擇時(shí),我希望自己也能夠向前一步,想著如何幫助讀者成長(zhǎng),或是實(shí)現(xiàn)一個(gè)產(chǎn)品幫助更多的人。


分享名稱:聊聊我與流式計(jì)算的故事
URL地址:http://www.dlmjj.cn/article/djjehej.html