RabbitMQ的面試問題

2021-10-05 04:54:30 字數 2743 閱讀 9876

為什麼使用訊息佇列啊?

訊息佇列都有什麼優點和缺點?

有點有上面說的解耦,非同步,削峰

缺點呢?

因為插入了mq這個訊息中介軟體,如果mq訊息中介軟體掛掉了,那麼像上面說的解耦的情況,服務a的訊息給bcdef等伺服器就傳送不出去了,如果mq沒有掛掉bc都從a中獲取了訊息,修改了資料庫的資料,但是d服務的監聽出問題了,這個時候會產生訊息的不一致,而且使用mq的話會出現各種各樣的問題,這些問題可能會導致整個專案的複雜性挺高n個檔次,所以我們在使用之前會再三確定,確定業務邏輯確實需要時,再進行使用。

題外話:

目前4中常見的mq

activemq :萬級吞吐量,社群不活躍,逐漸被替代

rabbitmq : 萬級吞吐量,社群活躍

rocketmq : 十萬級吞吐量,阿里出品

kafka :十萬級吞吐量,使用與大資料

如何保證訊息佇列的高可用啊?

這裡主要說道rabbitmq的高可用,

分為3鐘

1)單機模式

單機模式就不多說了,主要是給我們進行測試使用

2)集群模式

集群模式,這裡涉及到了乙個元資料和訊息資料的概念

元資料:是指我們配置queue的一些初始化的資料

我們集群了3個mq,那麼其中乙個mq的queue是有元資料和訊息資料的,其他的兩個上面只有元資料,當我們的服務監聽到不帶有訊息資料的queue時,這個被監聽的佇列會找到有訊息資料的mq的queue中,然後通過後面queue給服務傳送資料,這個集群方式非常麻煩,所以我們一般保證高可用時會使用映象模式。

3)映象模式

集群模式的優化版本,當我們使用了映象模式時,訊息傳送者將訊息傳送到mq的乙個節點上時,其他說有的節點都會被同步這個訊息,就像映象一樣每個節點上都有了這個訊息的映象,那麼在消費時獲得哪乙個節點上的資料都是直接獲得的了。

如何保證訊息不被重複消費啊?如何保證消費的時候是冪等的啊?

簡單來說,當我們的生產者向rabbitmq傳送訊息時,會給這個訊息加上乙個唯一的id,當我們的消費者從rabbitmq中監聽到了訊息時這個id也會一起傳遞,那麼我們有兩種方法去防止重複消費的問題

1)我們在消費者這邊去用set集合來儲存這個id,當消費者每次監聽到訊息時,都將監聽到的id與set中的訊息進行對比,如果沒有相同的id,則將資料進行具體的業務操作,並且儲存到set中

2)我們可以利用資料庫的主鍵來進行去重,當然這個得看具體的業務需求了。

如何保證訊息的可靠性傳輸啊?要是訊息丟失了怎麼辦啊?

訊息的丟失在整個過程中會有3個地方出現,

①當訊息從生產者到消費者時,訊息可能丟失,為了避免這種情況出現,我們可以首先在生產者傳送訊息之前,將這個訊息提前儲存到redis(或者其他的容器)中,我們要明白rabbitmq中有兩個機制,乙個是事務機制,乙個是confirm機制,第乙個事務機制是同步的,訊息生產者傳送訊息,如果mq接受成功,則提交,不成功則回滾;confirm機制基於channel設定,如果佇列和訊息是持久化的,當訊息被寫入磁碟中是會傳送確認資訊給生產者,第一種效率太差,一般我們會設定confirm。

那如何保證訊息的順序性?

為什麼會出現順序性的問題呢,因為我們的訊息通過mq傳送給了不同的服務,不同的服務在處理這些訊息時,不能保證其按照順序去執行,解決方法,我們可以將所有的訊息按照順序放在同乙個佇列中就可以了。

如何解決訊息佇列的延時以及過期失效問題?訊息佇列滿了以後該怎麼處理?有幾百萬訊息持續積壓幾小時,說說怎麼解決?

1)先修復consumer的問題,確保其恢復消費速度,然後將現有cnosumer都停掉

2)新建乙個topic,partition是原來的10倍,臨時建立好原先10倍或者20倍的queue數量

3)然後寫乙個臨時的分發資料的consumer程式,這個程式部署上去消費積壓的資料,消費之後不做耗時的處理,直接均勻輪詢寫入臨時建立好的10倍數量的queue

4)接著臨時徵用10倍的機器來部署consumer,每一批consumer消費乙個臨時queue的資料

5)這種做法相當於是臨時將queue資源和consumer資源擴大10倍,以正常的10倍速度來消費資料

6)等快速消費完積壓資料之後,得恢復原先部署架構,重新用原先的consumer機器來消費訊息

(2)這裡我們假設再來第二個坑

假設你用的是rabbitmq,rabbitmq是可以設定過期時間的,就是ttl,如果訊息在queue中積壓超過一定的時間就會被rabbitmq給清理掉,這個資料就沒了。那這就是第二個坑了。這就不是說資料會大量積壓在mq裡,而是大量的資料會直接搞丟。

這個情況下,就不是說要增加consumer消費積壓的訊息,因為實際上沒啥積壓,而是丟了大量的訊息。我們可以採取乙個方案,就是批量重導,這個我們之前線上也有類似的場景幹過。就是大量積壓的時候,我們當時就直接丟棄資料了,然後等過了高峰期以後,比如大家一起喝咖啡熬夜到晚上12點以後,使用者都睡覺了。

這個時候我們就開始寫程式,將丟失的那批資料,寫個臨時程式,一點一點的查出來,然後重新灌入mq裡面去,把白天丟的資料給他補回來。也只能是這樣了。

假設1萬個訂單積壓在mq裡面,沒有處理,其中1000個訂單都丟了,你只能手動寫程式把那1000個訂單給查出來,手動發到mq裡去再補一次

(3)然後我們再來假設第三個坑

如果走的方式是訊息積壓在mq裡,那麼如果你很長時間都沒處理掉,此時導致mq都快寫滿了,咋辦?這個還有別的辦法嗎?沒有,誰讓你第乙個方案執行的太慢了,你臨時寫程式,接入資料來消費,消費乙個丟棄乙個,都不要了,快速消費掉所有的訊息。然後走第二個方案,到了晚上再補資料吧。

RabbitMQ常見的面試問題

rabitmq是什麼?rabbitmq是一款使用erlang語言開發,基於amqp協議的訊息中介軟體.rabbitmq的應用場景是什麼?1.非同步通知 發簡訊,郵件的時候,採用非同步處理的方式,客戶無需等待通知結果 2.流量削鋒 在電商中大秒殺活動中,採用佇列長度來控制請求的數量,超過佇列的長度,則...

RabbitMQ 測試問題

使用eventlet併發consumer指令碼 eventlet.monkey patch all true msg per queue 50 queue num 10 rabbit host 10.23.54.150 5672 class consumer def init self,count ...

It面試問題

一般第一輪技術面都是來考察你最基本的技術功底。招聘季節,隨處可見抱著厚厚的 程式設計師面試寶典 啃的學生。偶爾也能看見 程式設計之美 劍指offer 的神書。這些經驗書確實有用。但是要想全面的掌握筆試面試的基礎考點,還是需要完整的複習。其實,筆試面試對計算機基礎的考察是萬變不離其宗的。其考點無非分為...