分享10道RabbitMQ相關面試題!!!

2021-10-11 18:16:07 字數 2423 閱讀 3115

1、解耦:如果多個模組或者系統中,互相呼叫很複雜,維護起來比較麻煩,但是這個呼叫

又不是同步呼叫,就可以運用 mq 到這個業務中。

2、非同步:這個很好理解,比如使用者的操作日誌的維護,可以不用同步處理,節約響應時間。

3、削峰:在高峰期的時候,系統每秒的請求量達到 5000,那麼呼叫 mysql 的請求也是5000,一般情況下 mysql 的請求大概在 2000 左右,那麼在高峰期的時候,資料庫就被打垮了,那系統就不可用了。此時引入 mq,在系統 a 前面加個 mq,使用者請求先到 mq,系統 a 從 mq 中每秒消費 2000 條資料,這樣就把本來 5000 的請求變為 mysql 可以接受的請求數量了,可以保證系統不掛掉,可以繼續提供服務。mq 裡的資料可以慢慢的把它消費掉。

(1)降低了系統可用性 (2)增加了系統的複雜性

rabbitmq 是比較有代表性的,因為是基於主從做高可用性的。以他為例,自行查閱以下模式。

rabbitmq 有三種模式:單機模式、普通集群模式、映象集群模式。

在特殊場景下有其對應的好處,解耦、非同步、削峰。

缺點有以下幾個:

系統可用性降低

系統引入的外部依賴越多,越容易掛掉。萬一 mq 掛了,mq 一掛,整套系統崩潰,你不就完了?

系統複雜度提高

硬生生加個 mq 進來,你怎麼保證訊息沒有重複消費?怎麼處理訊息丟失的情況?怎麼保證訊息傳遞的順序性?問題一大堆。

一致性問題

a 系統處理完了直接返回成功了,人都以為你這個請求就成功了;但是問題是,要是 bcd 三個系統那裡,bd 兩個系統寫庫成功了,結果 c 系統寫庫失敗了,咋整?你這資料就不一

致了。對於吞吐量來說 kafka 和 rocketmq 支撐高吞吐,activemq 和 rabbitmq 比他們低乙個數量級。對於延遲量來說 rabbitmq 是最低的。

1.從社群活躍度

按照目前網路上的資料,rabbitmq、activem 、zeromq 三者中,綜合來看,rabbitmq 是首選。

2.持久化訊息比較

activemq 和 rabbitmq 都支援。持久化訊息主要是指我們機器在不可抗力因素等情況下掛掉了,訊息不會丟失的機制。

3.綜合技術實現

可靠性、靈活的路由、集群、事務、高可用的佇列、訊息排序、問題追蹤、視覺化管理工具、

外掛程式系統等等。

rabbitmq/kafka 最好,activemq 次之,zeromq 最差。當然 zeromq 也可以做到,不過自己必須手動寫**實現,**量不小。尤其是可靠性中的:永續性、投遞確認、發布者證實和高可用性。

4.高併發

毋庸置疑,rabbitmq 最高,原因是它的實現語言是天生具備高併發高可用的 erlang 語言。

5.比較關注的比較,rabbitmq 和 kafka

rabbitmq 比 kafka 成熟,在可用性上,穩定性上,可靠性上,rabbitmq 勝於 kafka(理論上)。另外,kafka 的定位主要在日誌等方面, 因為 kafka 設計的初衷就是處理日誌的,可以看做是乙個日誌(訊息)系統乙個重要元件,針對性很強,所以 如果業務方面還是建議選擇 rabbitmq 。

還有就是,kafka 的效能(吞吐量、tps)比 rabbitmq 要高出來很多。

設定佇列屬性,佇列中所有訊息都有相同的過期時間

對訊息本身進行單獨設定,每條訊息的 ttl 可以不同

如果兩種方法一起使用,則訊息的 ttl 以兩者之間較小的那個數值為準

rabbitmq 的持久化分為:交換器的持久化、佇列的持久化和訊息的持久化

交換器和佇列的持久化都是通過在宣告時將 durable 引數置為 true 實現的

訊息的持久化是在傳送訊息指定 deliverymode 為 2 實現的

服務間非同步通訊

順序消費

定時任務

請求削峰

答:broker: 簡單來說就是訊息佇列伺服器實體

​ exchange: 訊息交換機,它指定訊息按什麼規則,路由到哪個佇列

​ queue: 訊息佇列載體,每個訊息都會被投入到乙個或多個佇列

​ binding: 繫結,它的作用就是把exchange和queue按照路由規則繫結起來

​ routing key: 路由關鍵字,exchange根據這個關鍵字進行訊息投遞

​ producer: 訊息生產者,就是投遞訊息的程式

​ consumer: 訊息消費者,就是接受訊息的程式

​ channel: 訊息通道,在客戶端的每個連線裡,可建立多個channel,每個channel代表乙個會話任務 由exchange、queue、routingkey三個才能決定乙個從exchange到queue的唯一的線路

​ 答:拆分多個 queue,每個 queue 乙個 consumer,就是多一些 queue 而已,確實是麻煩點;或者就乙個 queue 但是對應乙個 consumer,然後這個 consumer 內部用記憶體佇列做排隊,然後分發給底層不同的 worker 來處理。

MTK 10A socket程式設計相關經驗分享

0 其中135,就是十六進製制數,即309個位元組數,135後有個回車,其次才是真正的內容,最後結束時,會有個0作為結束符,是0之前有回車還是之後我給忘記了。上面的這個例子是傳過來內容比較少的,還有的情況就是內容比較多的,相關的例子手邊正好沒有,就不放上來了 chunked會分成幾個包,但小包最大不...

RabbitMQ訊息相關概念

當rabbitmq佇列擁有多個消費者時,佇列收到的訊息將以輪詢的分發方式傳送給消費者。每條訊息只會傳送給訂閱列表裡的乙個消費者。這種方式非常適合擴充套件,如果負載加重,那麼只需要建立更多的消費者來消費處理訊息即可。輪詢分發機制也不是那麼優雅,預設有n個消費者,那麼rabbitmq會將第m條訊息分發給...

RabbitMQ 安裝相關

安裝詳細 1 準備 3 配置 vim etc hosts 以及 etc hostname linux防火牆 3 配置檔案 比如修改密碼 配置等等,例如 loopback users 中的 只保留guest 服務啟動和停止 啟動 rabbitmq server start lsof i 5672 檢視...