前言背景
在分布式架構(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升序排序。

二、程序架構(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í)行即可。

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