歡迎關注我的公衆號:石杉的架構筆記(ID:shishan100)
面試
週一至週五早8點半!精品技術文章準時送上!算法
以前給你們聊了一下,面試時若是遇到消息中間件這個話題,面試官上來可能問的兩個問題:性能優化
關於這兩個問題的回答,能夠參見以前的兩篇文章:服務器
在問完這兩個問題以後,不一樣風格的面試官可能會展開不一樣的發問。網絡
針對那種工做年限比較長的資深的同窗,可能會開始就候選人所在公司使用的消息中間件,深刻裏面的技術細節,好比讓你聊聊RocketMQ的架構原理和核心源碼?架構
可是另一種面試風格,會先從大家的項目和業務入手進行考察,好比像下面這樣:併發
好!這篇文章,我們從第二種風格來聊聊。異步
咱們會落地到某個具體業務系統的某個場景下,看看如何使用消息中間件,而後其效果是什麼。分佈式
業務場景的話,我們就用你們都很熟悉的電商業務爲例,這裏爲了便於理解,對其作了必定的抽象和簡化。微服務
你們仍是來考慮一個下訂單的業務流程,好比你下個訂單,此時須要幹幾件事情:
說明一下:上述環節,爲了便於你們理解,作了簡化。實際真正複雜的電商系統裏,總體環節和業務流程會比這個複雜不少倍,並且耗時也絕對不是上面那麼簡單的。
老規矩!咱們仍是經過一張手繪圖,來看看這整個的業務流程:
如上圖,這個下訂單的業務流程中:
更新訂單狀態(20ms) + 扣減商品庫存(100ms) + 增長會員積分(80ms) + 附贈優惠券(50ms) = 250ms。
也就是說,僅僅是這4個流程的話,也就200多毫秒的耗時。
200多毫秒的耗時,對用戶下單體驗來講是很是快速的,幾乎就是一瞬間就完成了,不會感到過多的停頓,也就是一會兒就能夠看到本身下單成功了。
可是,若是加上那個調度倉儲發貨呢?
那個環節須要讀取大量的數據、使用多倉庫/多貨位的調度算法、還要跟C/S架構的倉儲系統進行網絡通訊,所以咱們這裏假設這個環節可能會耗時數十秒。
一旦加上那個調度倉儲發貨的環節到這個下單流程裏,就可能致使用戶要等頁面卡頓幾十秒後纔會看到下單成功的提示,這個用戶體驗就至關的差了。
按照以前一篇文章「Java進階面試系列之一」大家系統架構中爲什麼要引入消息中間件?的說法。對於這種場景,徹底適合使用消息中間件來進行異步化調用。
也就是說,訂單服務對倉儲調度發貨,僅僅是發送一個消息到MQ裏,而後倉儲服務消費消息以後再慢慢的執行調度算法,而後分配商品發貨任務給對應的倉庫便可。
這樣的話,就能夠把耗時幾十秒的倉儲調度發貨的環節,從下單流程裏摘除出去了。進而保證下單流程就僅僅是耗時200多毫秒而已。
至於那個耗時幾十秒的倉儲調度發貨環節,咱們經過異步的方式慢慢執行便可,不會影響用戶下單的體驗。
以上過程,咱們一樣來一張圖,你們直觀的感覺一下:
好!接下來咱們就假設你們在實際生產中還沒用過消息中間件,我們從0開始,看看如何落地?
對於已經在生產中使用過消息中間件的小夥伴,不妨也看看,權當複習,溫故知新!
咱們以RabbitMQ爲例,假如你用的消息中間件是RabbitMQ,那麼咱們對這個消息中間件應該如何安裝和部署呢?
很簡單,RabbitMQ的官方文檔裏提供了很是詳細的安裝部署步驟,你能夠在本身的筆記本電腦本地安裝,也能夠在公司的服務器上部署。
如今假設你已經參考了官方文檔並安裝完成,那麼接下來在代碼層面應該怎麼來引入RabbitMQ以及在系統裏實現收發消息呢?
下面經過一些HelloWorld級別的代碼和一些簡單的示例圖,給你們演示一下RabbitMQ是如何收發消息的。
對於不少在實際生產中使用過MQ的同窗,這些代碼可能對實際生產中使用過MQ的同窗,顯得太簡單了。
不過考慮到不少初學者可能連用都沒有用過MQ,甚至是才據說消息中間件不久,因此筆者認爲這些demo代碼以及手工繪圖,仍是頗有必要。
好!看完了代碼,這個時候,咱們能夠經過一張圖來想象一下兩個服務之間的通訊。
訂單服務你能夠啓動多個,不一樣的訂單服務均可以往一個RabbitMQ的queue裏推送消息。
倉儲服務你也能夠啓動多個,多個倉儲服務會採用round-robin的輪詢算法,每一個服務實例均可以從RabbitMQ queue裏消費到一部分的消息。
上面的圖裏,訂單服務在MQ專業術語中叫作「生產者」,英文是「Producer」,意思就是這個服務是專門負責生產消息投遞到MQ的。
倉儲服務在MQ專業術語中叫作「消費者」,英文是「Consumer」,意思就是這個服務專門是負責從MQ消費消息而後處理的。
這個時候,這套異步通訊的架構就能夠跑起來了。
好了,到目前爲止,雖然這個代碼還存在很多問題,可是不要緊,大致上咱們已經給一些不太熟悉MQ技術的同窗,從一個比較形象易於理解簡化後的電商業務場景出發,經過HelloWorld級別的示例代碼和手工繪圖,將MQ這個技術落地跑起來了。
更進一步,各位同窗徹底能夠參照這個文章裏的案例,思考一下:本身負責的項目裏,有沒有相似的業務場景可使用MQ的?
而後想辦法在本身的項目裏落地使用MQ的技術來作一下異步化,提高核心流程的性能。
這樣將來在跳槽面試的時候,才能夠作到遊刃有餘,有本身的一套東西能夠說。
END
【Java進階面試系列之四】哥們,若是消息中間件的消費者宕機了,會怎麼樣?【敬請期待】
若有收穫,請幫忙轉發,您的鼓勵是做者最大的動力,謝謝!
一大波微服務、分佈式、高併發、高可用的原創系列文章正在路上
歡迎掃描下方二維碼,持續關注:
石杉的架構筆記(id:shishan100)
十餘年BAT架構經驗傾囊相授
推薦閱讀:二、【雙11狂歡的背後】微服務註冊中心如何承載大型系統的千萬級訪問?
三、【性能優化之道】每秒上萬併發下的Spring Cloud參數優化實戰
六、大規模集羣下Hadoop NameNode如何承載每秒上千次的高併發訪問
七、【性能優化的祕密】Hadoop如何將TB級大文件的上傳性能優化上百倍
八、拜託,面試請不要再問我TCC分佈式事務的實現原理坑爹呀!
九、【坑爹呀!】最終一致性分佈式事務如何保障實際生產中99.99%高可用?
十一、【眼前一亮!】看Hadoop底層算法如何優雅的將大規模集羣性能提高10倍以上?
1六、億級流量系統架構之如何設計全鏈路99.99%高可用架構
1八、大白話聊聊Java併發面試問題之volatile究竟是什麼?
1九、大白話聊聊Java併發面試問題之Java 8如何優化CAS性能?
20、大白話聊聊Java併發面試問題之談談你對AQS的理解?
2一、大白話聊聊Java併發面試問題之公平鎖與非公平鎖是啥?
2二、大白話聊聊Java併發面試問題之微服務註冊中心的讀寫鎖優化
2三、互聯網公司的面試官是如何360°無死角考察候選人的?(上篇)
2四、互聯網公司面試官是如何360°無死角考察候選人的?(下篇)
2五、Java進階面試系列之一:哥們,大家的系統架構中爲何要引入消息中間件?