人們總是錯誤地使用佇列,最壞的情況是用它解決「超載(overload)」問題。fred hebert是《learn you some erlang for great good!》一書的作者。在這本erlang入門書籍中,他結合生動的插圖、恰當的例項以淺顯易懂的方式講解了技術問題。近日,他以同樣的方式闡釋了為什麼「佇列不能解決超載」。
他將系統比作乙個洗手池,如下所示:
在正常的操作下,資料只從左側流入,出口可以處理所有資料。但在一些重大活動期間,比如聖誕節,可能會出現如下情況:
資料從左右兩側同時流入系統。如果資料輸入越來越快,那麼出口就可能會無法及時處理所有資料。這時,人們通常會考慮增加乙個佇列緩衝區(如上圖的水槽)儲存臨時資料。但不管佇列多大,持續的超載都會導致如下情況的發生:
佇列滿了,系統崩潰。這時候,開發人員會檢視堆疊跟蹤、佇列、資料庫查詢以及呼叫的api。但經過各種優化,甚至更換更大的伺服器後,系統仍然無法承受這種持續的超載,因為瓶頸在出口(下圖中紅箭頭所示的位置):
該瓶頸可能是資料庫,可能是磁碟、頻寬或cpu。不消除這種瓶頸,任何優化都是徒勞。所以此時,開發人員應該做的是阻塞輸入,即「反壓(back-pressure)」或者丟棄資料,即「解除安裝(load-shedding)」。可能有人會認為,反壓會招致使用者的不滿。但實際上,即使不主動反壓,當系統負載達到一定程度後,速度也會降低,甚至崩潰。所以,雖然反壓會降低使用者的輸入速度,但卻可以保證系統的執行。另外,引入佇列作為一種優化機制會違背端到端原則。因此,開發人員應該設定更多允許超時的地方,提供故障檢測方法,並將其反饋給使用者。
如上圖所示,開發人員可以在識別出系統瓶頸後設定相應的反壓機制,避免資料流入過快。而依據檢查點的不同,開發人員可以對延遲和吞吐量實現不同層次的優化。
借助反壓或解除安裝,開發人員可以獲得以下好處:
總之,如果api設計考慮了端到端原則和冪等性,那麼反壓或解除安裝對呼叫者而言通常不會成為問題,因為它們可以安全地重試請求。
我的觀點:如果大量輸入持續一段較長時間,那麼佇列確實不能解決「超載」,但是如果只是在一小段時間內輸入較大,那麼加入佇列是可以解決「超載」問題的。
氣球能不能解決問題
另外一半來自比賽結束一小時。我們的團隊已經3 氣球。g 已經有了思路,a題 sj和wz在討論,好像也有了結果。b題 bqz隊已經出來了。遙遙看見 bqz隊青色的氣球,跟隊裡說。他們都能做出來的題目。咱們不可能 a不出來!那時候我已經有些浮躁了,我對都有說,另乙個半小時,我們這次能出來 6個題,要對自...
新華創 市場分析不能解決根本問題
市場分析不能解決根本問題 遠離 學會科學判斷,規避虧損和被騙 我們並不是不需要市場分析,然而,市場分析不能通向持續一致性的結果。它不能解決沒有自信 沒有紀律或不當的聚焦造成的交易問題。自信和恐懼都來自於我們的信念和態度,但又是互相矛盾的思想。自信要求絕對相信自己,即使在虧損會比自己想象的還要多的情況...
新華創 市場分析不能解決根本問題
市場分析不能解決根本問題 遠離 學會科學判斷,規避虧損和被騙 我們並不是不需要市場分析,然而,市場分析不能通向持續一致性的結果。它不能解決沒有自信 沒有紀律或不當的聚焦造成的交易問題。自信和恐懼都來自於我們的信念和態度,但又是互相矛盾的思想。自信要求絕對相信自己,即使在虧損會比自己想象的還要多的情況...