哈嘍!大家好,我是小奇,一位不靠譜的程式設計師
小奇打算以輕鬆幽默的對話方式來分享一些技術,如果你覺得通過小奇的文章學到了東西,那就給小奇一個贊吧
文章持續更新
一、前言
RabbitMQ我們經常的使用,但是它有很多高階的特性我們也需要熟練的掌握才能應對現實場景中複雜的業務邏輯。
二、面試
面試官:小奇是吧,我們開始面試吧
我:快點吧,早就飢渴難耐了
面試官:有用過RabbitMQ嗎
我:用過
三、RabbitMQ傳送訊息長時間沒人處理過期怎麼辦?
面試官:RabbitMQ傳送訊息長時間沒人處理過期怎麼辦?
我:訊息長時間沒人處理過期了我們為了不影響正常的交換機使用,我們可以將過期的訊息放到一個死信交換機中,然後這個交換機繫結一個佇列就是死信佇列,然後通過一個專門的消費者來處理這些過期的訊息
面試官:只有訊息到達過期時間沒有被消費會進入死信交換機嗎,還有其他的情況嗎
我:訊息成為死信一共有三種情況。
1:佇列訊息長度達到限制。
2:消費者拒收訊息,並且不將訊息放入原來的佇列中讓他重新傳送。
3:原佇列存在訊息過期設定,訊息達到超時時間未被消費。
面試官:我們怎麼定義一個死信交換機和死信佇列繫結呢?
我:我們可以通過x-dead-letter-exchange和x-dead-letter-routing-key兩個引數來配置好死信交換機的名稱,和死信交換機與死信佇列之間的路由鍵名稱。
四、TTL是什麼?
面試官:TTL是什麼?
我:TTL全稱Time To Live(存活時間/過期時間),是mq中用來設定過期時間的。
面試官:我們一般怎麼設定過期時間,用哪些方式?
我:我們有兩種設定過期時間的方式,一個是對單個訊息設定過期時間,一個是對一個佇列設定過期時間,這樣的話傳送到佇列中的訊息都遵循那個過期時間。
1:佇列設定過期時間:x-message-ttl,單位:ms(毫秒),這樣的話進入佇列的所有訊息都遵循這個過期時間。
2:單個訊息設定過期時間:expiration,單位:ms(毫秒),這樣的話只有這條訊息有過期時間。
面試官:那如果我即給單條訊息設定了時間又給佇列設定了時間會怎麼樣?
我:那樣的話根據最短的那個時間來。
五、RabbitMQ延時佇列怎麼設計?
面試官:那你知道延時佇列嗎,一般都用來做什麼場景下的需求呢?
我:知道,延時佇列一般就是傳送訊息到MQ中後,消費者不要第一時間去處理,比如我們點外賣的時候我們下單成功了,這個時候庫存已經減了,但是我們還沒有支付,如果我們一直不支付的話,過30分鐘訂單就自動取消了,然後庫存又恢復了。
面試官:那RabbitMQ有延時佇列嗎,如果讓你自己設計一個延時佇列怎麼設計呢?
我:RabbitMQ中沒有提供延時佇列的功能,但是我們可以使用TTL+死信佇列來實現延時佇列的功能。
面試官:可以呀小夥子,這塊掌握的不錯
我:還行還行,都是日常的積累
面試官:小夥子真厲害啊,RabbitMQ掌握的非常棒,你面試通過了,明天上崗吧
我:啊,這麼急嗎,我後面還有好多東西沒有講呢。
面試官:不著急,進來了以後慢慢聽你講,加班讓你跟我講
我:啊。。。這也太難了吧
六、總結
這裡關於RabbitMQ還沒有整理完畢,文章後面持續更新,建議收藏。
文章中涉及到的命令大家一定要像我一樣每個都敲幾遍,只有在敲的過程中才能發現自己對命令是否真正的掌握了。
如果覺得我的文章還不錯的話就點個贊吧