![]()
Cloudflare承認(rèn)了一個(gè)編程錯(cuò)誤,該錯(cuò)誤涉及React useEffect鉤子的使用不當(dāng),導(dǎo)致其平臺(tái)儀表板和多個(gè)API出現(xiàn)超過一小時(shí)的服務(wù)中斷。
這次故障發(fā)生在9月12日,持續(xù)了一個(gè)多小時(shí)。據(jù)工程副總裁Tom Lianza介紹,故障由儀表板中的一個(gè)錯(cuò)誤觸發(fā),該錯(cuò)誤導(dǎo)致"對(duì)租戶服務(wù)API的重復(fù)、不必要調(diào)用"。這個(gè)API是API請(qǐng)求授權(quán)邏輯的一部分,因此影響了其他API的正常運(yùn)行。
問題的排查過程相當(dāng)困難,因?yàn)楸砻嫔峡雌饋硎茿PI可用性問題,掩蓋了實(shí)際上是儀表板過載API的事實(shí)。
Lianza表示,核心問題出在React useEffect鉤子中,其"依賴數(shù)組中包含一個(gè)有問題的對(duì)象"。useEffect鉤子是一個(gè)包含多個(gè)參數(shù)的函數(shù),包括返回清理函數(shù)的設(shè)置函數(shù)和可選的依賴項(xiàng)列表。每當(dāng)依賴項(xiàng)發(fā)生變化時(shí),設(shè)置函數(shù)就會(huì)運(yùn)行。
在Cloudflare的這個(gè)案例中,該函數(shù)會(huì)調(diào)用租戶服務(wù)API,而其中一個(gè)依賴項(xiàng)是一個(gè)"在每次狀態(tài)或?qū)傩宰兓瘯r(shí)都會(huì)重新創(chuàng)建"的對(duì)象。結(jié)果是,在儀表板的單次渲染過程中,該鉤子反復(fù)運(yùn)行,而原本設(shè)計(jì)只運(yùn)行一次。函數(shù)運(yùn)行頻率過高,導(dǎo)致API過載,引發(fā)服務(wù)中斷。
useEffect鉤子功能強(qiáng)大但經(jīng)常被過度使用。相關(guān)文檔充滿了關(guān)于誤用和常見錯(cuò)誤的警告,并鼓勵(lì)在可能的情況下使用其他方法。useEffect的性能陷阱很常見。
這一事件在社區(qū)中引發(fā)了關(guān)于useEffect利弊的討論。一位開發(fā)者在Reddit上表示,對(duì)useEffect的抱怨太多了,它是React的重要組成部分,"認(rèn)為使用它是壞事的想法很愚蠢"。不過,另一種反應(yīng)是"消息還沒有被接收到。我認(rèn)識(shí)的幾乎每個(gè)人都繼續(xù)無緣無故地到處放置大量useEffect"。
還有人評(píng)論道:"真正的問題是API因過量API調(diào)用而宕機(jī)...在一家擁有專門服務(wù)來防止DDoS(分布式拒絕服務(wù))攻擊的公司中。"
Lianza表示,租戶服務(wù)沒有分配足夠的容量來"處理這樣的負(fù)載峰值",現(xiàn)在已經(jīng)為其分配了更多資源,并改進(jìn)了監(jiān)控。此外,從儀表板發(fā)出的API調(diào)用中添加了新信息,以區(qū)分重試和新請(qǐng)求,因?yàn)槿绻麍F(tuán)隊(duì)知道看到的是"大量新請(qǐng)求,就更容易將問題識(shí)別為儀表板中的循環(huán)"。
Q&A
Q1:什么是React useEffect鉤子?為什么會(huì)導(dǎo)致問題?
A:React useEffect鉤子是一個(gè)包含設(shè)置函數(shù)和依賴項(xiàng)列表的函數(shù),每當(dāng)依賴項(xiàng)變化時(shí)就會(huì)運(yùn)行。在Cloudflare的案例中,依賴數(shù)組中的對(duì)象在每次狀態(tài)變化時(shí)都被重新創(chuàng)建,導(dǎo)致鉤子在單次渲染中反復(fù)運(yùn)行,原本只應(yīng)運(yùn)行一次。
Q2:Cloudflare的這次故障具體是怎么發(fā)生的?
A:故障是由儀表板中的useEffect鉤子錯(cuò)誤引起的,該鉤子對(duì)租戶服務(wù)API進(jìn)行了重復(fù)、不必要的調(diào)用。由于API調(diào)用頻率過高,導(dǎo)致API過載,進(jìn)而影響了其他依賴該API的服務(wù),造成超過一小時(shí)的服務(wù)中斷。
Q3:Cloudflare采取了哪些措施來防止類似問題再次發(fā)生?
A:Cloudflare為租戶服務(wù)分配了更多資源以處理負(fù)載峰值,改進(jìn)了監(jiān)控系統(tǒng),并在儀表板的API調(diào)用中添加了新信息來區(qū)分重試和新請(qǐng)求,這樣可以更容易識(shí)別儀表板中的循環(huán)問題。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.