看完這篇,還怕面試官問消息中間件麼?

2020-12-25 代碼宇宙

註:文內內容為依據本人理解創作,如果錯誤,請留言告知。

先說需求

如果現有A、B兩個應用程式,B應用希望從A應用獲取到自己感興趣的信息,A和B部署在不同的機房,可能還有C、D、E等更多的這樣的應用程式需要A的這些消息,這就是我們常說的消息中間件的點對點、發布訂閱模式。

說到消息中間件,工作中經常會用到MQ消息中間件,常見的消息中間件有Apache的ActiveMQ以及RabbitMQ。

不管是ActiveMQ還是RabbitMQ都是基於JMS規範的消息中間件,它們都是消息服務的「提供者」。

那麼什麼是 JMS?Java Message Service (JMS)是Java中面向消息中間件為兩個或者多個組件之間發送消息的客戶端,它是生產者和消費者問題的一種實現。JMS是Java平臺企業版的一部分,目的是為了允許組件之間的通訊被鬆耦合、可靠、並且異步。

JMS 的 API 編程模型

1.弄清楚基本元素

首先要搞清楚消息服務中的幾個元素,即 提供者,客戶端、生產者/發布者,使用者/訂閱者,JMS消息,JMS隊列、JMS主題。

JMS 提供者(provider),這個很好理解,可以理解為消息的容器、消息的載體、消息的家,比如ActiveMQ就是一個 JMS 提供者,它為JMS提供了中間的服務。

JMS 客戶端(Client),指的是一個產生或者消費消息的一個進程或者應用。

JMS 生產者/發布者(producer/publisher)使用者/訂閱者(consumer/subscriber)是對應的關係表示的是創建發送和接收消息的客戶端。

JMS 消息(Message),即一個對象,表示 JMS 傳輸的數據,可以是一段文字,一個序列化的Java對象等等。

JMS 隊列(Queue),這個概念比較重要,JMS中的隊列是一個暫存區域,存儲的是 JMS 中已經發送成功但是等待讀取的消息(點對點模式下)。顧名思義,消息按照發送順序傳遞,JMS隊列保證每條消息都僅被處理一次。

JMS 主題(Topic),指的是一個發布機制,也就是我們常說的發布訂閱模式。

為了方便理解,我找到了這兩張圖片

點對點JMS消息傳遞

發布訂閱JMS消息傳遞

2.想明白兩種發布模式

JMS支持兩種不同的消息發布模式,通過下面的解釋,應該很容易明白。

No.1 點對點

在點對點消息傳遞模式下,消息被生產者傳遞到消息隊列中。這種消息類型基於消息隊列的發送方和接收方,每條消息都被發送到一個特定的隊列中,消費者也就是接收客戶端從保存了消息的隊列中提取消息,隊列的好處就是保證每條消息都會被消費,並且只會被一個消費者消費一次。消息隊列會保留髮送者也就是消息製造者的所有消息,直到消息被消費或者過期。

No.2 發布訂閱

說完了點對點,接下來就是發布訂閱,通過上面的圖片能清晰的看到,發布訂閱和隊列就沒什麼關係了,引入了一個新的概念那就是主題。比如我的微信公眾號「代碼宇宙」就是一個Topic,你關注我,小明也關注了我,小紅也關注了我,那麼我們就是一個發布訂閱的關係, 我發布文章就會推送給你們三個人,你如果取關了.....那麼我發布文章就不會再推送給你,即使你重新關注,你也收不到我之前的推送了。

3.搞懂誰是提供者

要使用JMS就必須有一個人站出來,管理會話、隊列、主題等繁雜工作。從 JavaEE 1.4開始,必須在所有 JavaEE 應用程式伺服器中包含 JMS 提供程序。

以下是常見的JMS提供者程序列表

Amazon SQS's Java Messaging LibraryApache ActiveMQApache Qpid, using AMQPIBM MQJBoss Messaging等等等等

4.什麼是同步消費和異步消費

在JMS中,消息消費可以通過兩個方式來實現。

No.1同步消費

在同步消息消費中,訂閱者/接收者通過調用receive()方法從目的地請求消息。在receive()中,如果消息在給定時間內沒有到達,方法將阻塞直到消息到達或超時。就像普通的帶有返回值的java方法調用一樣。

No.2異步消費

在異步消息消費中,訂閱者可以向消費者註冊(或訂閱)為消息監聽器。消息偵聽器與事件偵聽器相同,每當消息到達目的地時,JMS提供者將通過調用偵聽器的onMessage()方法來傳遞消息,該方法將對消息的內容起作用。

5.JMS 消息組件

JMS Message 即JMS 消息被用來在系統間進行通信。JMS消息具有簡單的格式,但是非常靈活,通常包含以下三個部分。

No.1 消息頭部(Message Header)

JMS 消息提供很多預定義欄位,這些欄位包含客戶機和提供者用來識別這些消息的關鍵信息。

– JMSDestination– JMSDeliveryMode– JMSMessageID– JMSTimestamp– JMSCorrelationID– JMSReplyTo– JMSRedelivered– JMSType– JMSExpiration– JMSPriority

No.2 消息屬性(Message Properties)

在消息屬性中,可以創建和設置消息的屬性。

消息屬性是由應用程式設置或讀取的自定義名稱值對。

消息屬性對於支持過濾消息很有用。

JMS API提供了一些提供者可以支持的預定義屬性,需要注意的是消息屬性是可選的。

No.3 消息體(Message Body)

在消息體中,JMS API定義了五種消息體格式,它們也被稱為消息類型,允許以多種不同的形式發送和接收數據,並提供與現有消息格式的兼容性。它基本上由從JMS發送者發送到接收者的實際消息組成。不同的消息類型有:

文本消息:由javax.jms.TextMessage表示。它用於表示一個文本塊。

對象消息:由javax.jms.ObjectMessage表示。它用於表示一個java對象。

字節消息:由javax . JMS . Bytes消息表示。它用於表示二進位數據。

流消息:由javax.jms.StreamMessage表示。它用於表示java 基元值的列表。

映射消息:用一組關鍵字或值對來表示。

5.必須清楚在哪用

說了這麼多,到底在哪用得到呢?應用場景才是技術的靈魂,JMS的應用場景其實隨處可見,舉幾個例子。

No.1 異步處理

用戶註冊成功後需要發送郵件或者是簡訊,這個時候就可以使用消息中間件的點對點模式來實現,用戶系統無需關心郵件或者簡訊發送結果,僅僅需要將需要發送的郵箱或者手機號通過消息傳遞給專門處理消息發送的系統即可。

No2.應用解耦

訂單和庫存系統是兩個相愛相殺的系統,訂單創建離不開庫存操作,如果訂單系統直接調用庫存系統那麼勢必造成模塊間的強耦合,導致系統復用性、健壯性變低,使用了消息中間件後關係發生了如下變化。

訂單系統->庫存系統(強耦合)

訂單系統->消息中間件->庫存系統(解耦成功)

No3.流量削峰

比如,系統舉行秒殺活動,熱門商品。流量蜂擁而至 100件商品,10萬人擠進來怎麼辦,10萬秒殺的操作,放入消息隊列。秒殺應用處理消息隊列中的10萬個請求中的100個,其他的打回,通知失敗。流量峰值控制在消息隊列處,秒殺應用不會瞬間被懟死,變化如下。

用戶請求->秒殺應用

用戶請求->消息隊列->秒殺應用

No.4 日誌處理

錯誤日誌->消息隊列->日誌處理

用戶行為日誌->消息隊列(kafka)->日誌的存儲或流式處理

說明:日誌處理 可是 kafka的強項,大數據的日誌處理非它莫屬,我沒用過,只知道它很強大。非常強大。

No.5 純粹的消息通訊

本文不以任何MQ講解的原因是,MQ 僅僅是 JMS 中的一部分,理解 JMS 規範後,消息中間件還不是手到擒來?

2020.04.16 晚

保持好奇的心,也許明天再見,晚安。

相關焦點

  • 面試完後,要不要給面試官打電話問面試結果?
    ,但還是想聽聽面試官怎麼說,又怕面試官拒絕,徒增對自己的不好的印象,只能在矛盾和糾結中等待…其實有的時候,面試的考察,一直持續到面試結束之後,所以打不打電話給面試官這個事,也並不是絕對的哈。我有一個朋友就因為面試完一周後給面試官打了個電話,最後拿到了工作。 過程其實是這樣的:我的朋友電話面試完了之後,等了一個星期,沒有任何通知(這個公司屬於中小型企業,沒有招聘官網可以看面試結果)。 心想可能是掛了,但是不甘心,就禮貌地打電話過去問了一下面試的結果,簡單地又表達了一下對於進入這家公司的渴望。
  • 面試官必問的這5個問題,答案都整理好了,還怕面試不成功嗎?
    面試官必問的這5個問題,答案都整理好了,還怕面試不成功嗎?原創|真的是自討苦吃在職場中,想要找到一個好工作實屬不易,現在競爭也是相當惡劣。面試官是為了看你語言表達能力和邏輯思維,不要前言不搭後語。那在這一個問題上不要回答的太平淡,那和你簡歷並無差別。面試官最想知道的是你是否能勝任這個工作。可以在自我簡單的介紹了後,在把自己平時所擅長的技能,自己比較不錯的愛好興趣,自己有哪些優點等等,你或許會覺得沒必要,其實面試官反而喜歡這樣的,技多不壓身,反而在其他地方需要你呢。
  • 求職面試篇:面試官都會問哪些問題
    哪些問題是HR必定問到的問題,哪些是上司必定會問到的問題。一、 針對簡歷的提問準備前面我們在《大學生初入職場如何寫一份優秀的簡歷(簡歷系列1/3篇)》這篇文章中,介紹了一份簡歷需要具備的最基本的要素,比如基本信息、求職意向、工作經歷、教育經歷、項目經歷、職業技能、自我評價。
  • 面試官說我的簡歷像包裝的,面試後面試官向我道歉了
    這不,馬上趕上金三銀四的黃金跳槽階段,小編的朋友就去試了試水,結果鎩羽而歸,找我一頓吐槽。現在面試問的問題真的太太太難了!面試官:你們微服務為什麼還選擇用SpringCloudNetflix而不是採用SpringCloudAlibaba呢?小編朋友:因為我參與的時候技術棧已經定了。
  • 大學生求職面試篇:面試官都會問哪些問題
    一、 針對簡歷的提問準備前面我們在《大學生初入職場如何寫一份優秀的簡歷(簡歷系列1/3篇)》這篇文章中,介紹了一份簡歷需要具備的最基本的要素,比如基本信息、求職意向、工作經歷、教育經歷、項目經歷、職業技能、
  • 面試完後,該不該給面試官打電話詢問面試效果?
    其實有的時候,面試的考察,一直持續到面試結束之後,所以打不打電話給面試官這個事,也並不是絕對的哈。01我有一個朋友就因為面試完一周後給面試官打了個電話,最後拿到了工作。過程其實是這樣的:我的朋友電話面試完了之後,等了一個星期,沒有任何通知(這個公司屬於中小型企業,沒有招聘官網可以看面試結果)。
  • 面試官問你上家公司做什麼的,聰明人這樣回,被高看一眼
    面試官問你上家公司做什麼的,聰明人這樣回,被高看一眼面試是我們經常需要面對的一件事情,無論你是應屆畢業生還是已經在職場打拼的老油條,你想進入一個新的公司,都必須通過公司的面試。那麼我們就會遇到很多問題,面試官會在這個時候詢問我們一些問題,如果你回答得好,那麼你在面試官的心裡就會加分,如果你回答得不好,那麼你在面試官的心裡就會減分。那麼我們就來聊一聊,面試的時候你都會遇到哪些問題。有的時候,面試官想要了解你更多的東西,就會問你上家公司是做什麼的。有些人在被問到這個問題的時候,就會非常寬泛的回答。例如:我上家公司是做自媒體的。
  • 面試官再問我如何保證 RocketMQ 不丟失消息,這回我笑了!
    最近看了 @JavaGuide發布的一篇『面試官問我如何保證Kafka不丟失消息?我哭了!』,這篇文章承接這個主題,來聊聊如何保證 RocketMQ 不丟失消息。0x00.消息的發送流程一條消息從生產到被消費,將會經歷三個階段:生產階段,Producer 新建消息,然後通過網絡將消息投遞給 MQ Broker存儲階段,消息將會存儲在 Broker 端磁碟中消息階段, Consumer 將會從 Broker 拉取消息以上任一階段都可能會丟失消息,我們只要找到這三個階段丟失消息原因,採用合理的辦法避免丟失,就可以徹底解決消息丟失的問題。
  • 【金三銀四】Java中間件面試題(2021最新版)
    而消息中間件在其中起到了一個中間橋梁的重要作用。因此,面試中也經常會被問到消息中間件相關的問題。從其使用到其原理設計,都會是面試官感興趣的一個點。Zookeeper1. ZooKeeper 是什麼?2. ZooKeeper 提供了什麼?
  • 當面試官問「你的缺點是什麼」這3點要知道,不然回答心裡沒有底
    過完年了,也非常多人找工作,但有時候想找到合適的工作也不容易,因為你選擇工作的時候,工作也有權選擇你,所以面試到時候很重要,有時候最怕回答的不好,就會在面試官留下不好的印象應聘不成功。當面試官問你,你的缺點是什麼的時候?你會怎麼回答?
  • 面試官:你有什麼問題要問我的?回答沒有被淘汰,問了3個被錄用
    一直密切盯著面試間的門,市場總監打開門跟候選人一起走了出來,小麥看了看時間:38.5分鐘!不禁心花怒放:這次肯定有戲!這也是她敢在市場總監一送走候選人就趕緊湊過來問結果的底氣。沒想到,市場總監黑著一張臉說:「還得繼續找,這個不行,我問他有什麼要問我的,他竟然說沒有!
  • 面試的時候,面試官問你:你還應聘了哪些單位?要說真話嗎
    面試是進入一個公司之前的一大挑戰,相信大家都遇到過很多比較難回答的問題,比如:問你結婚了嗎?其實這些問題背後,都隱含著面試官對你想要了解的方面,而並不是單純的閒聊。「除了我們公司,還應聘哪些公司?」這個問題也是HR經常會問到的一個問題。當你遇到這個問題的時候,該怎麼回答呢?回答:我應聘過一些單位了,面試官會不會覺得你太挑了,要回答:我就應聘過這一家,面試官會不會覺得太假了。其實,說真話更能打動人,主要是要清楚自己怎樣的回答才是最恰當!
  • 面試官不能說的秘密
    面試過程中,回答問題,要注意體現自己專業能力的深度,需要主動展現你對簡歷提到技術點的深入理解,不要讓面試官擠牙膏一樣的問。2、技術廣度技術廣度主要包括技術視野和思維模式這兩方面。關於技術視野,舉個慄子,比如你項目使用的是微服務分布式架構,面試官大概率會問,你們數據一致性是怎麼保障的?
  • 面試結束時問面試官這些問題,一舉驚豔面試官!
    面試官的最後一問並不總是漫不經心的,你也可以抓住這個機會。很多同學經常在面試結尾時遇到這樣的情況,「我的問題就到這裡,你還有什麼問題嗎?」在面試的最後,面試官總是以這個問題來結尾。但這個似乎是客套為主的最後一問,其實並非看起來那麼簡單。
  • 正愁校友面試?看這篇就完事!(下)
    此外,在面試前一兩天可以重新看一遍自己申請那個學校的profile,確定每一個問題都有完全針對性的回答。作為一個「你喜歡的我全都有,你討厭的我也全都有」的人設的女同志,我建議(無論你是男人女人還是變性人)都可以去「套路」一下你的面試官。當然,這是建立在你可能也像我一樣有一些演員和碧池的能力的情況下lol。
  • 面試官必問的5個開放式問題,第3個問的我尬場
    在最後一關的一對一面試中,我回答了十幾個開放式問題,這種題目沒有對錯沒有標準答案,還是要依照面試官看的角度,他心中的價值取向,才能斷言答題內容該如何選擇但是從答題的內容當中,完全可以體現一個人過去的經曆本身的性格,和他看待事物的視野角度,或是腦袋裝了多少東西。
  • 職場生存記:面試完該給面試官打電話諮詢結果嗎?
    大家都有求職面試的經歷,但是很多人在面試完之後,心裡沒有底氣,很想知道自己是否被錄用,想問面試官自己的表現如何,但是總是很膽怯;有的人內心其實是已經有了自己的判斷,但是還是想聽一下面試官對自己的評價,但是又害怕被拒絕,讓自己的印象分被扣,所以只能在矛盾中糾結裡等待……
  • 為什麼面試完以後,HR讓你等消息,但後面卻一直沒有消息?
    在求職招聘季,很多人在忙著投遞簡歷,公司也會邀請合適的人選過來參加面試。在面試完後,有的HR會告訴你說讓你回去等通知,甚至有的面試官還會具體告訴你他們會在一周之內或者幾天之內打電話,但後來求職者卻一直沒有收到一些公司的電話,這是怎麼回事呢?
  • 面試官讓回家等通知,沒有接到消息,要主動打電話聯繫嗎?
    工作了這麼多年,面試過不少人,也被面試過不少,我們公司結束面試的流程是這樣:第一步:你還有什麼問題要問我們? 問了候選人這麼多問題,也讓候選人問幾個問題,這既是對候選人尊重,也可以看到候選人關係的是什麼。
  • 面試官問:「你的興趣愛好是什麼?」這樣回答,面試官最滿意
    1 面試官為什麼要問這道題?面試官時間是很寶貴的,在短短一個小時之內,需要對候選人深入的了解,所以問任何問題都是有目的性的,那面試官問:「你的興趣愛好是什麼?」有什麼目的呢?1) 為了緩和氣氛,讓你為放鬆下來面試的時候,面試官和候選人一直在交鋒,如果一直氣氛很嚴肅,怕候選人進展,進而發揮不好,於是中間會穿插一些輕鬆的話題。