15個PHP關於高併發的面試題(總結)
相關文章推薦:《深入探討「高並發大流量」存取的解決想法與方案》
1、什麼是rabbitmq
採用AMQP高階訊息佇列協定的一種訊息佇列技術,最大的特點就是消費並不需要確保提供方存在,實現了服務之間的高度解耦
2、為什麼要使用rabbitmq
在分散式系統下具備非同步,削峰,負載平衡等一系列高階功能;
擁有持久化的機制,進程訊息,佇列中的資訊也可以保存下來。
實作消費者和生產者之間的解耦。
對於高並發場景下,利用訊息佇列可以使得同步存取變成串列存取達到一定量的限流,利於資料庫的操作。
可以使用訊息佇列達到非同步下單的效果,排隊中,後台進行邏輯下單。
3、使用rabbitmq的場景
服務間非同步通訊
順序消費
定時任務
#請求削峰
##4、如何確保訊息正確地傳送至RabbitMQ?如何確保訊息接收方消費了訊息?
發送方確認模式
#將頻道設為confirm模式(發送方確認模式),則所有在頻道上發布的訊息都會被指派一個唯一的ID。 一旦訊息被投遞到目的佇列後,或訊息被寫入磁碟後(可持久化的訊息),頻道會傳送一個確認給生產者(包含訊息唯一ID)。 如果RabbitMQ發生內部錯誤而導致訊息遺失,會發送nack(not acknowledged,未確認)訊息。 發送方確認模式是非同步的,生產者應用程式在等待確認的同時,可以繼續發送訊息。當確認訊息到達生產者應用程序,生產者應用程式的回調方法就會被觸發來處理確認訊息。接收者確認機制
#接收方訊息確認機制
消費者接收每一則訊息後都必須進行確認(訊息接收和訊息確認是兩個不同操作)。只有消費者確認了訊息,RabbitMQ才能安全地把訊息從佇列中刪除。 這裡並沒有用到逾時機制,RabbitMQ僅透過Consumer的連線中斷來確認是否需要重新傳送訊息。也就是說,只要連線不中斷,RabbitMQ給了Consumer足夠長的時間來處理訊息。保證資料的最終一致性;下面羅列幾種特殊情況
- #如果消費者接收到訊息,在確認之前斷開了連結或取消訂閱,RabbitMQ會認為訊息沒有被分發,然後重新分發給下一個訂閱的消費者。 (可能有訊息重複消費的隱患,需要去重)
- 如果消費者接收到訊息卻沒有確認訊息,連結也未斷開,則RabbitMQ認為該消費者繁忙,將不會給該消費者分發更多的訊息。
5.如何避免訊息重複投遞或重複消費?
在訊息生產時,MQ內部針對每個生產者發送的訊息產生一個inner-msg-id,作為去重的依據(訊息投遞失敗並重傳),避免重複的訊息進入佇列;在訊息消費時,要求訊息體中必須有一個bizId(對於同一業務全域唯一,如支付ID、訂單ID、貼文ID等)作為去重的依據,避免同一則訊息重複消費。6、訊息基於什麼傳輸?
由於TCP連線的建立和銷毀開銷較大,且並發數受系統資源限制,會造成效能瓶頸。 RabbitMQ使用通道的方式來傳輸資料。頻道是建立在真實的TCP連接內的虛擬連接,且每個TCP連接上的頻道數量沒有限制。7、訊息如何分發?
若該佇列至少有一個消費者訂閱,訊息將以循環(round-robin)的方式傳送給消費者。每個訊息只會分發給一個訂閱的消費者(前提是消費者能夠正常處理訊息並進行確認)。透過路由可實現多消費的功能8、訊息怎麼路由? #
訊息提供者->路由->一至多個佇列 當訊息發佈到交換器時,訊息將擁有一個路由鍵(routing key),在訊息建立時設定。透過佇列路由鍵,可以把佇列綁定到交換器上。
訊息到達交換器後,RabbitMQ會將訊息的路由鍵與佇列的路由鍵進行比對(針對不同的交換器有不同的路由規則);
常用的交換器主要分成三種
fanout:如果交換器收到訊息,將會廣播到所有綁定的佇列上
direct:如果路由鍵完全匹配,訊息就會被投遞到對應的佇列
topic:可以讓來自不同來源的訊息能夠到達同一個佇列。使用topic交換器時,可以使用通配符
9、如何確保訊息不遺失?
訊息持久化,當然前提是佇列必須持久化RabbitMQ確保持久性訊息能從伺服器重新啟動中恢復的方式是,將它們寫入磁碟上的一個持久化日誌文件,當發布一條持久性訊息到持久性交換器上時,Rabbit會在訊息提交到日誌檔案後才發送回應。
一旦消費者從持久佇列中消費了一條持久化訊息,RabbitMQ會在持久化日誌中把這則訊息標記為等待垃圾收集。如果持久化訊息在被消費之前RabbitMQ重啟,那麼Rabbit會自動重建交換器和佇列(以及綁定),並重新發布持久化日誌檔案中的訊息到適當的佇列。
10、使用RabbitMQ有什麼好處?
1、服務間高度解耦
2、非同步通訊效能高
3、流量削峰
11、rabbitmq的叢集
鏡像叢集模式
你建立的queue,無論元資料或queue裡的消息都會存在於多個實例上,然後每次你寫訊息到queue的時候,都會自動把訊息到多個實例的queue裡進行訊息同步。
好處在於,你任何一個機器宕機了,沒事,別的機器都可以用。壞處在於,第一,這個效能開銷也太大了吧,訊息同步所有機器,導致網路頻寬壓力和消耗很重!第二,這麼玩兒,就沒有擴展性可言了,如果某個queue負載很重,你加機器,新增的機器也包含了這個queue的所有數據,並沒有辦法線性擴展你的queue
12.mq的缺點
系統可用性降低
系統引入的外部依賴越多,越容易掛掉,本來你就是A系統呼叫BCD三個系統的介面就好了,人ABCD四個系統好好的,沒啥問題,你偏加個MQ進來,萬一MQ掛了咋整? MQ掛了,整套系統崩潰了,你不就結束了。
系統複雜度提高
硬生加個MQ進來,你怎麼保證訊息沒有重複消費?怎麼處理訊息遺失的情況?怎麼保證訊息傳遞的順序性?頭大頭大,問題一大堆,痛苦不已
#13.一致性問題
A系統處理完了直接返回成功了,人都以為你這個請求就成功了;但是問題是,要是BCD三個系統那裡,BD兩個系統寫庫成功了,結果C系統寫庫失敗了,咋整?你這數據就不一致了。
所以訊息佇列實際上是一種非常複雜的架構,你引入它有很多好處,但是也得針對它帶來的壞處做各種額外的技術方案和架構來規避掉,最好之後,你會發現,媽呀,系統複雜度提升了一個數量級,也許是複雜了10倍。但是關鍵時刻,用,還是得用的
14. 分散式交易
分段提交。會有一個仲裁者,然後給所有節點來發送訊息。當所有節點都ack之後,才會成功。否則就得等待重發。
15.針對直播這種突然大流量的情況,該怎麼設計。
NGINX加上機器
#cdn快取靜態頁面
redis隊列,讓用戶慢點進來。
加上快取。快取用戶數據,例如用戶資訊。
資料庫使用主從
彈性擴充功能
- ##限流熔斷
PHP教學》
以上是15個PHP關於高併發的面試題(總結)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。
