概念介紹
在kafka中,有許多請求并不是立即回傳,而且處理完一些異步操作或者等待某些條件達成后才回傳,這些請求一般都會帶有timeout引數,表示如果timeout時間后服務端還不滿足回傳的條件,就判定此次請求為超時,這時候kafka同樣要回傳超時的回應給客戶端,這樣客戶端才知道此次請求超時了,比如ack=-1的producer請求,就需要等待所有的isr備份完成了才可以回傳給客戶端,或者到達timeout時間了回傳超時回應給客戶端,
上面的場景,可以用延遲任務來實作,也就是定義一個任務,在timeout時間后執行,執行的內容一般就是先檢查回傳條件是否滿足,滿足的話就回傳客戶端需要的回應,如果還是不滿足,就發送超時回應給客戶端,
對于延遲操作,java自帶的實作有Timer和ScheduledThreadPoolExecutor,這兩個的底層資料結構都是基于一個延遲佇列,在準備執行一個延遲任務時,將其插入到延遲佇列中,這些延遲佇列其實就是一個用最小堆實作的優先級佇列,因此,插入一個任務的時間復雜度是O(logN),取出一個任務執行后調整堆的時間也是O(logN),
如果要執行的延遲任務不多,O(logN)的速度已經夠快了,但是對于kafka這樣一個高吞吐量的系統來說,O(logN)的速度還不夠,為了追求更快的速度,kafka的設計者使用了Timing Wheel的資料結構,讓任務的插入時間復雜度達到了O(1),
Timing Wheel
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/436402.html
標籤:其他
上一篇:架構師之路Learn Day7之Hive生產環境最佳實踐
下一篇:Rabbitmq的一些筆記
