你真的了解延時佇列嗎 一

2022-05-07 05:09:09 字數 1740 閱讀 2585

2.1 輪詢

特點:定期輪訓資料庫,設定狀態。

優點:實現簡單

缺點:資料量過大時會消耗太多的io資源,效率太低

2.2 delayqueue

特點: 無界、延遲、阻塞佇列

a、blockingqueue+priorityqueue(堆排序)+delayed

b、delayqueue中存放的物件需要實現compareto()方法和getdelay()方法。

c、getdelay方法返回該元素距離失效還剩餘的時間,當<=0時元素就失效了,

就可以從佇列中獲取到。

這裡為什麼要用leader/follower模式?

2.3 timer與timertask

timer是一種定時器工具,用來在乙個後台執行緒計畫執行指定任務。它可以計畫執行乙個任務一次或反覆多次。 主要方法:

2.4 時間輪(kafka)

時間輪名詞解釋:

根據每個timertaskentry的過期時間和當前時間輪的時間,選擇乙個合適的bucket(實際上就是timertasklist),把這個timertaskentry物件放進去,同時如果bucket的過期時間有更新,就將這個bucket推進delayqueue,重新排序

例子:假設編號為0的時間格或者桶儲存著到期時間為t,每乙個tick的持續時間(tickduration)為20ms,在這個格仔裡只能儲存著到期時間為[t~t+20]ms的任務,假設時間輪的時間格有n個,每乙個間隔1ms,到期時間為m(ms),那麼計算公式m%n = 所在的時間格或者桶,比如n=10,m=34ms,那麼他所在桶或者時間格是4

2.5 rabbitmq-延時任務

rabbitmq本身沒有直接支援延遲佇列功能,但是可以通過以下特性模擬出延遲佇列的功能。

rabbitmq可以針對queue和message設定 x-message-tt,來控制訊息的生存時間,如果超時,則訊息變為dead letter rabbitmq針對佇列中的訊息過期時間有兩種方法可以設定。 a: 通過佇列屬性設定,佇列中所有訊息都有相同的過期時間。 b: 對訊息進行單獨設定,每條訊息ttl可以不同。

2.6 quartz

為什麼不用timer?

核心概念:排程器、任務和觸發器。

三者關係:排程器負責排程各個任務,到了某個時刻或者過了一定時間,觸發器觸動了,特定任務便啟動執行。

scheduler是乙個計畫排程器容器(總部),容器裡面可以盛放眾多的jobdetail和trigger,當容器啟動後,裡面的每個jobdetail都會根據trigger按部就班自動去執行。

jobdetail是乙個可執行的工作,它本身是有狀態的。

trigger代表什麼時候去調。

當jobdetail和trigger在scheduler容器上註冊後,形成了裝配好的作業(jobdetail和trigger所組成的一對兒),就可以伴隨容器啟動而排程執行了。

scheduler是個容器,容器中有乙個執行緒池,用來並行排程執行每個作業,這樣可以提高容器效率。

**於:

你真的了解Java嗎?

三目運算子規則 如果第二個和第三個運算元具有相同的型別,那麼它就是條件表示式的類 型。換句話說,你可以通過繞過混合型別的計算來避免 煩。如果乙個運算元的型別是 t,t 表示 byte short 或 char,而另乙個運算元是乙個 int 型別的常量表示式,它的值是可以用型別 t 表示的,那麼條件表...

你真的了解restful api嗎?

在以前,乙個 的完成總是 all in one 頁面,資料,渲染全部在服務端完成,這樣做的最大的弊端是後期維護,擴充套件極其痛苦,開發人員必須同時具備前後端知識。於是慢慢的後來興起了前後端分離的思想 後端負責資料編造,而前端則負責資料渲染,前端靜態頁面呼叫指定api獲取到有固定格式的資料,再將資料展...

你真的了解git嗎?

看了幾遍廖雪峰的git教程和阮一峰的git教程之後,覺得自己使用git已經是得心應手了,腦中也構建出了一副關於git操作的影象。學習乙個新東西的時候我總是喜歡把知識形象化出乙個圖譜在腦中,這樣記憶的更加深刻。但是隨著使用的深入,我發現我腦中的影象與git的實際行為存在出入。稍微進入一下正題。假如你的...