amqp协议 面试_分布式消息中间件-RabbitMQ面试题(必问)
1、什么是 rabbitmq
采用 AMQP 高級消息隊列協議的一種消息隊列技術,最大的特點就是消費并不需要確保提供方存在,實現了服務之間的高度解耦
2、為什么要使用 rabbitmq
(1)在分布式系統下具備異步,削峰,負載均衡等一系列高級功能;
(2)擁有持久化的機制,進程消息,隊列中的信息也可以保存下來。
(3)實現消費者和生產者之間的解耦。
(4)對于高并發場景下,利用消息隊列可以使得同步訪問變為串行訪問達到一定量的限流,利于數據庫的操作。
(5)可以使用消息隊列達到異步下單的效果,排隊中,后臺進行邏輯下單。
3、使用 rabbitmq 的場景
(1)服務間異步通信
(2)順序消費
(3)定時任務
(4)流量削峰
(5)解耦(為面向服務的架構(SOA)提供基本的最終一致性實現)
4、如何確保消息正確地發送至 RabbitMQ? 如何確保消息接收方消費了消息?
發送方確認模式
將信道設置成 confirm 模式(發送方確認模式),則所有在信道上發布的消息都會被指派一個唯一的 ID。
一旦消息被投遞到目的隊列后,或者消息被寫入磁盤后(可持久化的消息),信道會發送一個確認給生產者(包含消息唯一 ID)。
如果 RabbitMQ 發生內部錯誤從而導致消息丟失,會發送一條 nack(notacknowledged,未確認)消息。
發送方確認模式是異步的,生產者應用程序在等待確認的同時,可以繼續發送消息。當確認消息到達生產者應用程序,生產者應用程序的回調方法就會被觸發來處理確認消息。
接收方確認機制
消費者接收每一條消息后都必須進行確認(消息接收和消息確認是兩個不同操作)。只有消費者確認了消息,RabbitMQ 才能安全地把消息從隊列中刪除。
這里并沒有用到超時機制,RabbitMQ 僅通過 Consumer 的連接中斷來確認是否需要重新發送消息。也就是說,只要連接不中斷,RabbitMQ 給了 Consumer 足夠長的時間來處理消息。保證數據的最終一致性;
下面羅列幾種特殊情況
(1)如果消費者接收到消息,在確認之前斷開了連接或取消訂閱,RabbitMQ 會認為消息沒有被分發,然后重新分發給下一個訂閱的消費者。(可能存在消息重復消費的隱患,需要去重)
(2)如果消費者接收到消息卻沒有確認消息,連接也未斷開,則 RabbitMQ 認為該消費者繁忙,將不會給該消費者分發更多的消息。
5.如何避免消息重復投遞或重復消費?
在消息生產時,MQ 內部針對每條生產者發送的消息生成一個 inner-msg-id,作為去重的依據(消息投遞失敗并重傳),避免重復的消息進入隊列;在消息消費時,要求消息體中必須要有一個 bizId(對于同一業務全局唯一,如支付 ID、訂單 ID、帖子 ID 等)作為去重的依據,避免同一條消息被重復消費。
6、消息基于什么傳輸?
由于 TCP 連接的創建和銷毀開銷較大,且并發數受系統資源限制,會造成性能瓶頸。RabbitMQ 使用信道的方式來傳輸數據。信道是建立在真實的 TCP 連接內的虛擬連接,且每條 TCP 連接上的信道數量沒有限制。
7、RabbitMQ 的集群
鏡像集群模式
你創建的 queue,無論元數據還是 queue 里的消息都會存在于多個實例上,然后每次你寫消息到 queue 的時候,都會自動把消息到多個實例的 queue 里進行消息同步。
好處在于,你任何一個機器宕機了,沒事兒,別的機器都可以用。壞處在于,第一,這個性能開銷也太大了吧,消息同步所有機器,導致網絡帶寬壓力和消耗很重!第二,這么玩兒,就沒有擴展性可言了,如果某個 queue 負載很重,你加機器,新增的機器也包含了這個 queue 的所有數據,并沒有辦法線性擴展你的 queue
這里還有luke精心準備的其他中間件的內容,可以對比一下特性和內容
IT架構師luke:Kafka面試題(高吞吐量必問)?zhuanlan.zhihu.com祝小伙伴們面試順利,拿到心儀offer,奧利給!
IT架構師luke:Redis面試題(BAT大廠真題)?zhuanlan.zhihu.com如果你喜歡我寫的技術文章以及面試總結,歡迎關注收看我的視頻,并且點贊、收藏、關注我哦。
我是luke,感謝你的關注!
知乎視頻?www.zhihu.com總結
以上是生活随笔為你收集整理的amqp协议 面试_分布式消息中间件-RabbitMQ面试题(必问)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何查看tensorflow源代码
- 下一篇: java 分享巧克力_[leetcode