延遲任務排程系統 技術選型與設計(上篇)

2022-06-08 09:09:10 字數 3388 閱讀 8782

redis實現

delayqueue實現

時間輪實現

之前的設計(db/delayqueue/zookeeper)

另一種方案(db/delayqueue/zookeeper/mq

下面所討論技術方案的前提是精確觸發,所以我們不討論目前業界的一些分布式排程系統如:elastic-job,xxl-job,tbschedule等, 這些系統解決不了延遲任務精確觸發問題。

通過死信和死信路由實現

原理如下:

何為死信:

rabbitmq可以對佇列和訊息設定x-message-tt、expiration來控制訊息的存活時間,如果超時,訊息變為死信。

何為死信路由:

rabbitmq可以對佇列設定x-dead-letter-exchange和x-dead-letter-routing-key兩個引數。

當訊息在乙個佇列中變成死信後會按這兩個引數路由,訊息就可以重新被消費。

例項操作:

建立延遲佇列(設定死信路由)

建立就緒佇列

建立死信路由

繫結死信路由與就緒佇列

傳送延遲訊息

訊息過期後進入就緒佇列

優點:

缺點:

所以需要確保業務上每個任務的延遲時間是一致的。如果有不同延時的任務,需要為每種不同延遲的任務單獨建立訊息佇列,缺乏靈活性。

原理如下:

核心**流程:

其原理是延遲訊息會被儲存到mnesia表,在exchange中根據每個message頭設定的延遲時間x-delay,訊息過期後才路由到對應佇列。

例項操作:

安裝外掛程式

- /users/oldlu/workspace/document/docker-compose/rabbitmq/rabbitmq_delayed_message_exchange-0.0.1.ez:/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.8/plugins/rabbitmq_delayed_message_exchange-0.0.1.ez

啟用外掛程式

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

原始碼分析

核心函式

訊息入隊:internal_delay_message

啟動timer:maybe_delay_first

訊息處理:handle_info

優點:缺點:有序集合(sorted set)是redis提供的一種資料結構,具有set和hash的特點。

其中每個元素都關聯乙個score,並以這個score來排序。

其內部實現用到了兩個資料結構:hash table和 skip list(跳躍表)

skip list的特點

主要命令

實現延遲佇列

將延遲任務加到sorted set,將延遲時間設為score

啟動乙個執行緒不斷判斷sorted set中第乙個元素的score是否大於當前時間

如果大於,從sorted set中移除任務並新增到執行佇列中

如果小於,進行短暫休眠後重試

例項操作

root@redis:/usr/local/bin# redis-cli127.0.0.1:6379> zadd delayqueue 1 task1

(integer) 1127.0.0.1:6379> zadd delayqueue 2 task2

(integer) 1127.0.0.1:6379> zadd delayqueue 4 task4

(integer) 1127.0.0.1:6379> zadd delayqueue 3 task3

(integer) 1127.0.0.1:6379>127.0.0.1:6379> zrange delayqueue 0 0 withscores1) "task1"

優點:缺點:delayqueue是乙個使用優先佇列實現的blockingqueue,優先佇列比較的是時間,內部儲存的是實現delayed介面的物件。 只有在物件過期後才能從佇列中獲取物件。

內部結構

該模式工作的任何時間點,只有乙個執行緒成為leader ,負責事件監聽,而其他執行緒都是follower,在休眠中等待成為leader。 該模式的工作執行緒存在三種狀態,工作執行緒同一時間只能處於一種狀態,這三種狀態為

processing:執行緒正在處理事件,處理完事件如果當前執行緒集中沒有領導者,它將成為新領導者,否則轉為追隨者。

following:執行緒處於追隨者狀態,等待成為新的領導者也可能被領導者指定來處理新的事件。

核心原始碼分析:

入隊public boolean offer(e e) 

return true;

} finally

}

出隊public e take() throws interruptedexception  finally }}

}} finally

}

優點:缺點:未完待續。

原文:延遲任務排程系統(技術選型與設計)

延遲任務排程系統 技術選型與設計(上篇)

redis實現 delayqueue實現 時間輪實現 之前的設計 db delayqueue zookeeper 另一種方案 db delayqueue zookeeper mq 下面所討論技術方案的前提是精確觸發,所以我們不討論目前業界的一些分布式排程系統如 elastic job,xxl job...

技術選型與設計

作為乙個畢業不到一年的程式設計小白,前段時間參與了乙個準實時資料處理的專案 在這個專案中我獨自負責sql轉化中介軟體開發的任務 在接到這個任務的時候,即是興奮又是忐忑 興奮是自己能獨自負責一塊重要的東西,忐忑的是自己負責的是這次專案的核心部分,怕自己能力尚淺 事實證明,這兩樣我都說對了 開工第一天,...

分布式任務排程系統選型

spring cloud 實戰 乾貨 mybatis 實戰 乾貨 spring boot 實戰 乾貨 react 入門實戰 乾貨 構建中小型網際網路企業架構 乾貨 python 學習持續更新 定位為輕量級無中心化解決方案,使用 jar 包的形式提供分布式任務的協調服務。支援分布式排程協調 彈性擴容縮...