1. 程式人生 > 其它 >訊息中介軟體相關面試題

訊息中介軟體相關面試題

1、什麼是訊息中介軟體?

  是利用高效可靠的訊息傳遞機制進行非同步的資料傳輸,並基於資料通訊進行分散式系統的整合。通過提供訊息佇列模型和訊息傳遞機制,可以在分散式環境下擴充套件程序間的通訊。

2、為什麼要使用訊息中介軟體?

  系統解耦:使用訊息佇列來作為兩個系統的通訊方式。兩個系統不需要相互依賴,實現解耦。  

  非同步呼叫:系統C給訊息佇列傳送訊息後,可以非阻塞執行其他任務。

  流量削峰:高峰期積壓一些請求在MQ裡,然後高峰期過了,由消費者自己控制消費速度,在一定時間內消費完畢

3、訊息中介軟體有哪些傳遞模式?

訊息中介軟體一般有兩種傳遞模式:

   點對點模式:一對一,訊息生產者將訊息傳送到訊息佇列中,訊息消費者從佇列中接收訊息。訊息可以在訊息佇列中進行非同步傳輸。

        釋出/訂閱模式:一對多,通過一個內容節點(主題topic)來發布和訂閱訊息,訊息釋出者將訊息釋出到某個主題,訊息訂閱者訂閱這個主題的訊息。訊息的釋出與訂閱相互獨立。

4、如何保證訊息不被重複消費

  Kafka內部:在每個 MQ 寫入佇列時,會給這條資料分配一個序號 offset,消費者在消費資料時,會把消費過的 offset序號 提交,下次從大於提交序號的最小資料開始消費。

Kafka的rebalance機制是什麼?

消費者分割槽分配策略:輪詢分割槽、Sticky策略、Range範圍分割槽(預設)

什麼時候會觸發?

只要資料量發生變化的時候,就會觸發rebalance機制。組員個數發生變化、訂閱topic個數發生變化、訂閱topic分割槽數發生變化

Kafka是pull?push?以及優劣勢分析

Kafka遵循傳統設計:producer將訊息推送到broker,consumer從broker拉取訊息

kafka選取傳統pull模式,push模式下當producer推送的速率遠大於consumer消費的速率時,consumer可能崩潰且pull模式下如果broker沒有可供訊息的資訊,導致consumer不斷在迴圈中輪詢,直到訊息到達。

其次,pull模式下的consumer可以自主決定是否批量從broker拉取資料。

Kafka訊息丟失的場景有哪些?

生產者在生產過程中的訊息丟失。ACK=0,producer傳送一次就不傳送了,不管是否傳送成功。

broker在故障後的訊息丟失。ACK=1(預設),吞吐量與可靠性的一個折中方案。

消費者在消費過程中的訊息丟失。ACK=-1,生產和儲存不會丟失資料,(消費丟失)

ACK機制為1、0、-1

OFFset機制:kafka消費者的三種消費語義

at-most-once:最多一次(可能丟資料?)

at-least-once:最少一次(可能重複消費資料+)

exact-once message:精確一次 1

kafka中zookeeper的作用是什麼?

zookeeper是分散式協調,不是資料庫。

kafka使用zookeeper的分散式鎖和分散式配置及統一命名的分散式協調解決方案

kafka的broker叢集中的controller的選擇,是通過zookeeper的臨時節點爭搶獲得的。

kafka中broker中的狀態資料儲存在zookeeper中,zookeeper不是資料庫,儲存的屬於元資料。

kafka中高效能如何保障?

效能的最大瓶頸是IO,broker持久化資料時使用磁碟順序讀寫,再進一步優化就是0拷貝的使用(從磁碟日誌到消費者客戶端的資料傳遞),分散式系統做tradeoff,速度與可用性/可靠性

RabbitMq的架構設計?

是單機的mq元件。是AMQP的實現。

  Broker:提供一種傳輸服務,角色就是維護生產者到消費者的路線,保證資料能安裝指定的方式進行傳輸。

  Exchange:訊息交換機,指定訊息按什麼規則,路由到那個佇列。

  Queue:訊息載體,每個訊息都會被偷到一個或多個佇列

  Bindind:繫結,吧exchange和queue按照路由規則繫結起來

  RoutingKey:路由關鍵字,exchange根據關鍵字訊息投遞

  vhost:虛擬主機,一個broker裡有多個vhost,用於不同使用者許可權分離

  Producer:訊息生產者,投遞訊息的程式

  Consomer:訊息消費者,接受訊息的程式

  Channel:訊息通道,在客戶端的每個連線裡,可建立多個channel

核心:在mq領域中,producer將msg傳送queue,consumer消費queue完成pc介面

  kafka由producer決定msg傳送到那個queue

  rabbitmq由exchange決定msg怎樣傳送到目標queue,這就是bingding及對應的策略。

RabbitMq的事務訊息原理?

有事務、確認。

確認是對一件事的確認,事務是對批量的確認。增刪改查中,事務是對於增刪改的保證。

傳送方事務:開啟事務,傳送多條資料,事務提交|回滾是原子性的,要麼都提交,要麼都回滾

消費方事務:消費方是讀取行為,ACK是要手動提交,最終確定以事務的提交|回滾決定。

RabbitMq的如何保證訊息傳送和訊息接收?

訊息傳送確認:ConfirmCallback方法,訊息傳送到broker後回撥,確認訊息是否到達broker伺服器(確認是否到達exchange)

returnCallBack方法,失敗返回,路由不到佇列時回撥(可以不用,交換機和佇列在程式碼裡繫結)

  訊息確認模式:自動確認、根據情況確認、手動確認

訊息接收確認:訊息確認機制(ACK)預設自動確認,傳送給消費者後立即確認,但存在丟失訊息的可能,若消費端拋異常,回滾只保證資料的一致性,訊息還是丟失。即沒有成功處理就丟失。

  訊息確認模式:確認當前資訊、否定當前資訊、拒絕當前資訊

RabbitMq的死信佇列、延時佇列是如何實現的?

DLX,死信交換機。

死信佇列:當佇列中訊息被拒絕、過期會變成死信,死信可以被重新發布到另一個交換機,這個交換機就是死信佇列

原因:資訊被拒接、過期、超時、超過子佇列的最大長度

  死信佇列中,可以為普通交換器繫結多個訊息佇列,假設繫結過期時間為5分鐘、10分鐘和30分鐘,3個訊息佇列,每個佇列設定DLX,並關聯一個死信佇列。過期後的訊息轉存死信佇列,投遞指定消費者消費。

設定過期訊息的兩種方式:①x-message-ttl,所有訊息相同過期時間;②expiration屬性,每條訊息過期時間不同,以過期時間小的為準。

  訊息到達過期時間沒有被消費,訊息就變成死信訊息。

延遲佇列:儲存延遲訊息。訊息釋出後,指定時間之後再投遞消費者。如訂單30s內付款,超時後偷掉消費者處理超時訂單。

  rabbitMQ沒有直接支援延遲佇列,可以通過死信佇列實現。