高性能架構(gòu)設(shè)計(jì)-分布式定時(shí)任務(wù)

前言背景

在分布式架構(gòu)中涉及到定時(shí)任務(wù)總是讓人感覺(jué)到頭疼,為了應(yīng)對(duì)不斷增長(zhǎng)的定時(shí)任務(wù)數(shù)量,需要橫向擴(kuò)展節(jié)點(diǎn)線性的提升任務(wù)處理數(shù)量。本章節(jié)簡(jiǎn)要概述兩種設(shè)計(jì)方案。一切只為高性能!

一、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

數(shù)據(jù)存在redis當(dāng)中(設(shè)計(jì)方案不同redis版本不同),數(shù)據(jù)結(jié)構(gòu)采用有序集合,score存放任務(wù)執(zhí)行的時(shí)間戳,value存放將要執(zhí)行的任務(wù)的taskId,排序按照score升序排序。

分布式定時(shí)任務(wù)表結(jié)構(gòu)

二、程序架構(gòu)設(shè)計(jì)

1、搶占式

技術(shù)組件:redis(版本任意)

設(shè)計(jì)思想:每個(gè)分布式實(shí)例均開(kāi)啟一個(gè)分布式定時(shí)任務(wù)的專有線程,方式采用搶占式,先到先得,每秒鐘去redis中查詢當(dāng)前時(shí)刻以及之前的所有任務(wù)(根據(jù)score中存放的時(shí)間戳字段),查詢后刪掉防止其他實(shí)例獲得(此處需要redis事務(wù)操作)。

相關(guān)redis命令:

watch key

multi

ZRANGEBYSCORE key -inf now()

ZREMRANGEBYSCORE key -inf now()

exec

2、調(diào)度式

技術(shù)組件:redis5.0(版本至少是5.0,因?yàn)?.0版本增加了zpopmin命令)、消息中間件(這里用rocketMQ)

設(shè)計(jì)思想:搶占式的方案有明顯缺點(diǎn),如果任務(wù)集中在某一個(gè)時(shí)刻過(guò)多,有可能該時(shí)刻處理不完,所以方案需要優(yōu)化就有了-調(diào)度式。實(shí)現(xiàn)一個(gè)調(diào)度系統(tǒng)專門用來(lái)處理任務(wù)調(diào)度,通過(guò)zcount命令查詢出當(dāng)前時(shí)間內(nèi)可用的任務(wù)數(shù)量,然后除以實(shí)例數(shù)量,可以計(jì)算出每個(gè)實(shí)例處理多少任務(wù),之后通過(guò)mq發(fā)送廣播,這樣每個(gè)實(shí)例收到廣播消息知道對(duì)應(yīng)的處理任務(wù)數(shù),之后通過(guò)zpopmin命令(5.0版本新增)pop出任務(wù)數(shù)根據(jù)taskId執(zhí)行即可。

調(diào)度式分布式定時(shí)任務(wù)架構(gòu)圖

本文章嚴(yán)禁轉(zhuǎn)載!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容