天天看點

php 公衆号 模闆消息id如何擷取_2020最新分布式消息中間件-RabbitMQ面試題(必問)...

php 公衆号 模闆消息id如何擷取_2020最新分布式消息中間件-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

祝小夥伴們面試順利,拿到心儀offer,奧利給!

PHP愛好者:2020最新Mysql分庫分表面試題(mysql高可用方案解析)​zhuanlan.zhihu.com

php 公衆号 模闆消息id如何擷取_2020最新分布式消息中間件-RabbitMQ面試題(必問)...
以上内容希望幫助到大家,需要更多文章可以關注公衆号:PHP從入門到精通,

很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些PHP進階、架構視訊資料和大廠PHP面試PDF免費擷取,

需要戳這裡PHP進階架構師>>>實戰視訊、大廠面試文檔免費擷取