本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,具體涉及分布式定時(shí)任務(wù)調(diào)度系統(tǒng)及方法。
背景技術(shù):
在大型軟件系統(tǒng)構(gòu)建過(guò)程中經(jīng)常涉及異步任務(wù)處理,異步任務(wù)通過(guò)定時(shí)器定時(shí)調(diào)度執(zhí)行。在Java平臺(tái)下,現(xiàn)有的定時(shí)任務(wù)調(diào)度模塊包括Spring框架自帶的輕量級(jí)任務(wù)模塊(即Spring task),或者Spring框架支持的Quartz調(diào)度器(即Quartz調(diào)度器)。
在Spring框架中可以采用任務(wù)模塊調(diào)度執(zhí)行定時(shí)任務(wù)時(shí),可以配置任務(wù)模塊,指定定時(shí)任務(wù)執(zhí)行入口及時(shí)間規(guī)則。該任務(wù)模塊隨Spring啟動(dòng)而啟動(dòng),到達(dá)定時(shí)時(shí)間后執(zhí)行定時(shí)任務(wù)。然而,Spring框架本身是一個(gè)JavaEE應(yīng)用框架,不支持分布式機(jī)制。Spring框架下的定時(shí)任務(wù)均是單實(shí)例執(zhí)行。Spring框架沒(méi)有實(shí)現(xiàn)實(shí)例間相互協(xié)作及數(shù)據(jù)交互的機(jī)制,因此,利用Spring框架本身無(wú)法直接實(shí)現(xiàn)將定時(shí)任務(wù)集合分布到不同定時(shí)器模塊上,也不可能在系統(tǒng)運(yùn)行期間動(dòng)態(tài)增減定時(shí)器模塊以及與重新調(diào)度期間受影響的定時(shí)任務(wù)重新執(zhí)行。
在Spring框架中也可以使用Quartz調(diào)度器調(diào)度執(zhí)行定時(shí)任務(wù)。Quartz調(diào)度器是一個(gè)企業(yè)級(jí)的定時(shí)任務(wù)調(diào)度系統(tǒng),本身支持集群功能。Quartz調(diào)度器使用數(shù)據(jù)庫(kù)鎖方式來(lái)控制哪個(gè)Quartz調(diào)度器實(shí)例執(zhí)行定時(shí)任務(wù)。然而,對(duì)數(shù)據(jù)庫(kù)加鎖操作,不僅性能低下而且容易產(chǎn)生死鎖,因此并不適合于定時(shí)任務(wù)較多的大型分布式系統(tǒng)。
上述現(xiàn)有的定時(shí)任務(wù)調(diào)度模塊均可以看作定時(shí)任務(wù)調(diào)度的組件,而非完備的系統(tǒng)。定時(shí)任務(wù)調(diào)度模塊與任務(wù)模塊的執(zhí)行都在同一個(gè)進(jìn)程空間中。當(dāng)定時(shí)任務(wù)較多時(shí),系統(tǒng)負(fù)載較重、性能低下且強(qiáng)耦合,從而難以直接應(yīng)用到大型系統(tǒng)中,不利于形成獨(dú)立可云端部署的產(chǎn)品。
而且,現(xiàn)有的定時(shí)任務(wù)調(diào)度模塊沒(méi)有web管理端,難以對(duì)定時(shí)任務(wù)進(jìn)行管理,如增加、修改、刪除定時(shí)任務(wù),以及查看定時(shí)任務(wù)執(zhí)行情況等等,因而使用不便,用戶(hù)體驗(yàn)不佳。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明的目的在于提供分布式定時(shí)任務(wù)調(diào)度系統(tǒng)及方法,其中,調(diào)度器和定時(shí)器以分布方式運(yùn)行,并且允許在web端對(duì)定時(shí)任務(wù)進(jìn)行管理,從而可以提高系統(tǒng)效率和改善用戶(hù)體驗(yàn)。
根據(jù)本發(fā)明的一方面,提供一種分布式定時(shí)任務(wù)調(diào)度系統(tǒng),包括:調(diào)度器,用于進(jìn)行多個(gè)定時(shí)任務(wù)的任務(wù)分配;定時(shí)器,所述定時(shí)器包括多個(gè)定時(shí)器模塊,用于根據(jù)所述任務(wù)分配啟動(dòng)定時(shí);執(zhí)行器,所述執(zhí)行器多個(gè)服務(wù)模塊,所述多個(gè)服務(wù)模塊根據(jù)所述多個(gè)定時(shí)器模塊的指令,在達(dá)到所述多個(gè)定時(shí)任務(wù)的時(shí)間條件時(shí)啟動(dòng)或停止執(zhí)行服務(wù);以及分布式服務(wù)框架,用于支持所述調(diào)度器和所述定時(shí)器分布式部署和運(yùn)行,其中,所述調(diào)度器在系統(tǒng)運(yùn)行期間動(dòng)態(tài)分配定時(shí)任務(wù)。
優(yōu)選地,所述調(diào)度器根據(jù)哈希一致性算法將所述多個(gè)定時(shí)任務(wù)分配給所述多個(gè)定時(shí)器模塊。
優(yōu)選地,在所述多個(gè)定時(shí)任務(wù)變化的情形下,所述調(diào)度器將所述多個(gè)定時(shí)任務(wù)中的至少一部分定時(shí)任務(wù)重新分配給所述多個(gè)定時(shí)器模塊。
優(yōu)選地,所述調(diào)度器監(jiān)聽(tīng)定時(shí)器模塊的狀態(tài),以確定所述多個(gè)定時(shí)任務(wù)是否發(fā)生變化。
優(yōu)選地,所述調(diào)度器包括主調(diào)度器模塊和從調(diào)度器模塊,并且,所述主調(diào)度器模塊針對(duì)所述多個(gè)定時(shí)任務(wù),選擇所述調(diào)度器中的相應(yīng)一個(gè)調(diào)度器模塊分配定時(shí)任務(wù)。
優(yōu)選地,所述調(diào)度器和所述定時(shí)器之間采用同步接口進(jìn)行通信,所述定時(shí)器和所述執(zhí)行器之間采用Http請(qǐng)求進(jìn)行通信。
優(yōu)選地,還包括:web管理端,所述web管理端提供用戶(hù)界面,用于添加、修改、刪除定時(shí)任務(wù),以及用于查看定時(shí)任務(wù)的執(zhí)行情況。
優(yōu)選地,所述web管理端與所述調(diào)度器之間采用同步接口進(jìn)行通信。
優(yōu)選地,所述同步接口為thrift協(xié)議的接口。
優(yōu)選地,還包括數(shù)據(jù)庫(kù),用于存儲(chǔ)所述調(diào)度器和所述定時(shí)器的配置數(shù)據(jù)和緩存數(shù)據(jù)。
根據(jù)本發(fā)明的另一方面,提供一種分布式定時(shí)任務(wù)調(diào)度方法,包括:?jiǎn)?dòng)多個(gè)服務(wù)模塊;根據(jù)分配定時(shí)任務(wù)請(qǐng)求,調(diào)度器分配定時(shí)任務(wù),其中,調(diào)度器從定時(shí)器中的多個(gè)定時(shí)器模塊中選擇相應(yīng)的定時(shí)器模塊及傳送任務(wù)規(guī)則;選定的定時(shí)器模塊根據(jù)任務(wù)規(guī)則啟動(dòng)定時(shí);以及在達(dá)到所述多個(gè)定時(shí)任務(wù)的時(shí)間條件時(shí),所述選定的定時(shí)器模塊啟動(dòng)或停止執(zhí)行所述多個(gè)服務(wù)模塊中的相應(yīng)服務(wù),其中,所述調(diào)度器和所述定時(shí)器以分布式方式運(yùn)行,并且所述調(diào)度器在系統(tǒng)運(yùn)行期間動(dòng)態(tài)分配定時(shí)任務(wù)。
優(yōu)選地,調(diào)度器分配定時(shí)任務(wù)的步驟包括:根據(jù)哈希一致性算法將所述多個(gè)定時(shí)任務(wù)分配給所述多個(gè)定時(shí)器模塊。
優(yōu)選地,調(diào)度器分配定時(shí)任務(wù)的步驟包括:根據(jù)所述定時(shí)任務(wù)的ID生成第一哈希值;根據(jù)所述多個(gè)定時(shí)器模塊的ID生成多個(gè)第二哈希值;以及將所述第一哈希值和所述多個(gè)第二哈希值映射到閉合的環(huán)形空間中。
優(yōu)選地,針對(duì)所述第一哈希值,根據(jù)所述環(huán)形空間中所述多個(gè)第二哈希值中按順時(shí)鐘最近的方式關(guān)聯(lián)相應(yīng)的第二哈希值,根據(jù)第一哈希值及相應(yīng)的第二哈希值建立所述定時(shí)任務(wù)與所述多個(gè)定時(shí)器模塊的對(duì)應(yīng)關(guān)系,根據(jù)所述對(duì)應(yīng)關(guān)系,所述調(diào)度器將所述定時(shí)任務(wù)分配給所述多個(gè)定時(shí)器模塊中相應(yīng)的一個(gè)定時(shí)器模塊。
優(yōu)選地,在所述定時(shí)任務(wù)變化的情形下,所述調(diào)度器重新分配定時(shí)任務(wù)。
優(yōu)選地,所述調(diào)度器監(jiān)聽(tīng)定時(shí)器模塊的狀態(tài),以確定所述多個(gè)定時(shí)任務(wù)是否發(fā)生變化。
優(yōu)選地,所述調(diào)度器和所述定時(shí)器之間采用同步接口進(jìn)行通信,所述定時(shí)器和所述執(zhí)行器之間采用Http請(qǐng)求進(jìn)行通信。
優(yōu)選地,所述任務(wù)規(guī)則包括服務(wù)名稱(chēng)以及時(shí)間設(shè)定條件。
優(yōu)選地,所述時(shí)間設(shè)定條件包括:在延遲預(yù)定時(shí)間后所述服務(wù)一次,或者所述服務(wù)以預(yù)定時(shí)間間隔周期性執(zhí)行。
所述分布式定時(shí)任務(wù)調(diào)度系統(tǒng)中的調(diào)度器和定時(shí)器以分布方式運(yùn)行,從而可以提高系統(tǒng)效率。該系統(tǒng)允許動(dòng)態(tài)分配定時(shí)任務(wù),便于進(jìn)行任務(wù)管理,從而可以改善用戶(hù)體驗(yàn)。
附圖說(shuō)明
通過(guò)參照以下附圖對(duì)本發(fā)明實(shí)施例的描述,本發(fā)明的上述以及其它目的、特征和優(yōu)點(diǎn)將更為清楚,在附圖中:
圖1為根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度系統(tǒng)的系統(tǒng)架構(gòu)圖;
圖2示出根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度方法的流程圖;
圖3示出根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度方法中初始分配任務(wù)的流程圖;
圖4a和4b示出根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度方法中初始分配任務(wù)的不同步驟的示意圖;
圖5示出根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度方法中重新分配任務(wù)的流程圖;以及
圖6a至6c示出根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度方法中重新分配任務(wù)的不同步驟的示意圖。
具體實(shí)施方式
以下基于實(shí)施例對(duì)本發(fā)明進(jìn)行描述,但是本發(fā)明并不僅僅限于這些實(shí)施例。在下文對(duì)本發(fā)明的細(xì)節(jié)描述中,詳盡描述了一些特定的細(xì)節(jié)部分。對(duì)本領(lǐng)域技術(shù)人員來(lái)說(shuō)沒(méi)有這些細(xì)節(jié)部分的描述也可以完全理解本發(fā)明。為了避免混淆本發(fā)明的實(shí)質(zhì),公知的方法、過(guò)程、流程沒(méi)有詳細(xì)敘述。另外附圖不一定是按比例繪制的。
附圖中的流程圖、框圖圖示了本發(fā)明實(shí)施例的系統(tǒng)、方法、裝置的可能的體系框架、功能和操作,流程圖和框圖上的方框可以代表一個(gè)模塊、程序段或僅僅是一段代碼,所述模塊、程序段和代碼都是用來(lái)實(shí)現(xiàn)規(guī)定邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,所述實(shí)現(xiàn)規(guī)定邏輯功能的可執(zhí)行指令可以重新組合,從而生成新的模塊和程序段。因此附圖的方框以及方框順序只是用來(lái)更好的圖示實(shí)施例的過(guò)程和步驟,而不應(yīng)以此作為對(duì)發(fā)明本身的限制。
圖1為根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度系統(tǒng)的系統(tǒng)架構(gòu)圖。該分布式定時(shí)任務(wù)調(diào)度系統(tǒng)包括分布式服務(wù)框架110、數(shù)據(jù)庫(kù)120、調(diào)度器130、定時(shí)器140和執(zhí)行器150。
分布式服務(wù)框架110作為系統(tǒng)的全局分布式協(xié)調(diào)器,用于管理調(diào)度器130和定時(shí)器140。分布式服務(wù)框架110例如是選自Zookeeper、Dubbo的一種。
數(shù)據(jù)庫(kù)120用于存儲(chǔ)整個(gè)系統(tǒng)數(shù)據(jù),包括調(diào)度器130和定時(shí)器140的配置數(shù)據(jù)和緩存數(shù)據(jù)。例如,數(shù)據(jù)庫(kù)120存儲(chǔ)定時(shí)任務(wù)ID和相關(guān)的定時(shí)器模塊ID。數(shù)據(jù)庫(kù)120例如是選自O(shè)RACLE、SYBASE、InfORMix、SQL Server和MySQL的一種。
調(diào)度器130包括多個(gè)調(diào)度模塊,圖中僅示出調(diào)度模塊131和132,分別作為主調(diào)度模塊和從調(diào)度模塊。調(diào)度模塊131和132接收外部管理端傳送的操作命令,例如定時(shí)任務(wù)的添加、修改和刪除、以及定時(shí)任務(wù)的查看。調(diào)度模塊131和132根據(jù)操作命令進(jìn)行定時(shí)任務(wù)分配。在該實(shí)施例中,由于調(diào)度器130基于分布式服務(wù)框架110,因此,調(diào)度器130的多個(gè)調(diào)度模塊可以分布于不同的服務(wù)器中。
定時(shí)器140包括多個(gè)定時(shí)器模塊,圖中僅示出定時(shí)器模塊141和142。定時(shí)器140與調(diào)度器130之間進(jìn)行同步通信,例如基于thrift框架的同步模式的通信接口實(shí)現(xiàn)二者之間的通信。在實(shí)現(xiàn)定時(shí)器140與外部組件的通信時(shí),采用thrift框架可以允許可擴(kuò)展且跨語(yǔ)言的多個(gè)服務(wù)的部署,因此有利于實(shí)現(xiàn)服務(wù)開(kāi)發(fā)和部署的靈活性。定時(shí)器140的定時(shí)器模塊141和142根據(jù)調(diào)度器130的定時(shí)任務(wù)分配進(jìn)行定時(shí)任務(wù)調(diào)度。在該實(shí)施例中,由于定時(shí)器140基于分布式服務(wù)框架110,因此,定時(shí)器140的多個(gè)定時(shí)器模塊可以分布于不同的服務(wù)器中。
執(zhí)行器150包括多個(gè)服務(wù)模塊,圖中僅示出服務(wù)模塊151和152。執(zhí)行器150與定時(shí)器140中可以經(jīng)由Http請(qǐng)求實(shí)現(xiàn)二者之間的通信。服務(wù)模塊151和152是定時(shí)任務(wù)調(diào)度的具體執(zhí)行者。執(zhí)行器150的服務(wù)模塊151和152與定時(shí)器140中的相應(yīng)一個(gè)定時(shí)器模塊相關(guān)聯(lián)。在定時(shí)器140的定時(shí)器模塊達(dá)到時(shí)間條件時(shí),執(zhí)行器150中的相應(yīng)服務(wù)模塊執(zhí)行相應(yīng)的的的服務(wù)。在該實(shí)施例中,由于執(zhí)行器150根據(jù)Http請(qǐng)求傳送的指令而執(zhí)行服務(wù),因此,執(zhí)行器150的多個(gè)服務(wù)模塊可以分布于不同的服務(wù)器中,并且不限于本地或遠(yuǎn)程服務(wù)器,也不限于同構(gòu)或異構(gòu)服務(wù)器。
在上述實(shí)施例的分布式定時(shí)任務(wù)系統(tǒng)中,調(diào)度器的多個(gè)調(diào)度模塊和定時(shí)器的多個(gè)定時(shí)器模塊基于分布式服務(wù)框架部署和運(yùn)行,因此可以運(yùn)行于多個(gè)服務(wù)器的多個(gè)進(jìn)程空間中,從而可以減輕系統(tǒng)負(fù)載,并且可以云端部署,從而降低系統(tǒng)成本和可靠性。由于調(diào)度器和定時(shí)器與執(zhí)行器之間弱耦合,因此可以形成獨(dú)立的產(chǎn)品。
在一個(gè)優(yōu)選的實(shí)施例中,該分布式定時(shí)任務(wù)調(diào)度系統(tǒng)還可以包括日志和監(jiān)控模塊,用于記錄任務(wù)執(zhí)行相關(guān)的信息以及監(jiān)控系統(tǒng)狀態(tài)。
在另一個(gè)優(yōu)選的實(shí)施例中,該分布式定時(shí)任務(wù)調(diào)度系統(tǒng)還可以包括web管理端160。該web管理端160提供用戶(hù)界面,用于添加、修改、刪除定時(shí)任務(wù),同時(shí)可以用于查看定時(shí)任務(wù)的執(zhí)行情況。web管理端160與調(diào)度器130之間進(jìn)行同步通信,例如基于thrift框架的同步模式的通信接口實(shí)現(xiàn)二者之間的通信。在實(shí)現(xiàn)web管理端160與調(diào)度器130之間的通信時(shí),采用thrift框架可以允許可擴(kuò)展且跨語(yǔ)言的多個(gè)服務(wù)的部署,因此有利于實(shí)現(xiàn)服務(wù)開(kāi)發(fā)和部署的靈活性。
根據(jù)該優(yōu)選的實(shí)施例,該分布式定時(shí)任務(wù)調(diào)度系統(tǒng)可以作為具有完備功能的系統(tǒng),而非某種組件,從而可以避免進(jìn)行二次開(kāi)發(fā)。例如,該分布式定時(shí)任務(wù)調(diào)度系統(tǒng)可以直接由用戶(hù)使用。在一個(gè)實(shí)例中,該分布式定時(shí)任務(wù)調(diào)度系統(tǒng)可以作為SaaS(軟件即服務(wù))組件形成產(chǎn)品。
圖2示出根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度方法的流程圖。
在步驟S01中,系統(tǒng)啟動(dòng)執(zhí)行器中的多個(gè)服務(wù)模塊。每個(gè)服務(wù)模塊具有特定的功能和服務(wù)地址。例如,在企業(yè)郵箱之類(lèi)的分布式定時(shí)任務(wù)調(diào)度系統(tǒng)中,可以設(shè)置多個(gè)服務(wù)模塊,例如,用戶(hù)管理模塊、新郵件通知模塊、附件存檔模塊等。每個(gè)服務(wù)模塊的服務(wù)地址例如包括IP地址和端口號(hào)。
在步驟S02中,分布式服務(wù)框架中的調(diào)度器的主調(diào)度模塊接收外部管理端傳送的分配定時(shí)任務(wù)請(qǐng)求。主調(diào)度模塊根據(jù)系統(tǒng)負(fù)載和調(diào)度規(guī)則,進(jìn)一步選擇由自身或從調(diào)度模塊進(jìn)行任務(wù)調(diào)度。
在步驟S03中,選定執(zhí)行任務(wù)調(diào)度的調(diào)度模塊隨機(jī)生成唯一識(shí)別碼(UUID),作為定時(shí)任務(wù)ID,以及根據(jù)哈希(Hash)一致性算法選擇定時(shí)器中的相應(yīng)一個(gè)定時(shí)器模塊,并且向選定執(zhí)行定時(shí)任務(wù)的定時(shí)器模塊發(fā)送任務(wù)規(guī)則。例如,該任務(wù)規(guī)則包括服務(wù)名稱(chēng)以及時(shí)間設(shè)定條件。該時(shí)間設(shè)定條件包括:在延遲預(yù)定時(shí)間后服務(wù)模塊執(zhí)行一次,或者服務(wù)模塊以預(yù)定時(shí)間間隔周期性執(zhí)行。
在步驟S04中,選定執(zhí)行定時(shí)任務(wù)的定時(shí)器模塊接收時(shí)間規(guī)則,并且啟動(dòng)定時(shí)。
在步驟05中,在達(dá)到時(shí)間設(shè)定條件后,定時(shí)器中的定時(shí)器模塊向執(zhí)行器中的服務(wù)模塊發(fā)送指令,使得所述服務(wù)模塊根據(jù)任務(wù)規(guī)則啟動(dòng)或停止。例如,定時(shí)器模塊可以根據(jù)服務(wù)模塊的服務(wù)地址,發(fā)送Http請(qǐng)求,從而控制服務(wù)模塊的執(zhí)行過(guò)程。
在一個(gè)優(yōu)選的實(shí)施例中,該分布式定時(shí)任務(wù)調(diào)度方法還包括:采用web管理端,向調(diào)度器的主調(diào)度模塊發(fā)送分配定時(shí)任務(wù)請(qǐng)求。該web管理端提供用戶(hù)界面,用于添加、修改、刪除定時(shí)任務(wù),同時(shí)可以用于查看定時(shí)任務(wù)的執(zhí)行情況,從而可以直接由用戶(hù)使用,避免進(jìn)行二次開(kāi)發(fā)。
圖3示出根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度方法中初始分配任務(wù)的流程圖。相應(yīng)地,圖4a和4b示出根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度方法中初始分配任務(wù)的不同步驟的示意圖。
在管理端發(fā)送添加定時(shí)任務(wù)請(qǐng)求時(shí),調(diào)度器中選定執(zhí)行任務(wù)調(diào)度的調(diào)度模塊將執(zhí)行以下步驟以添加新的定時(shí)任務(wù),其中,根據(jù)哈希(Hash)一致性算法選擇定時(shí)器中的相應(yīng)一個(gè)定時(shí)器模塊。
在步驟S11中,調(diào)度模塊隨機(jī)生成唯一識(shí)別碼(UUID),作為定時(shí)任務(wù)ID。
在步驟S12中,調(diào)度模塊計(jì)算定時(shí)任務(wù)ID的哈希值,并且將其映射到0~(2^32)-1的數(shù)字空間中。
在哈希一致性算法中,將數(shù)字空間的全部數(shù)字頭尾相連,形成一個(gè)閉合的環(huán)形空間。在環(huán)形空間中,從第一個(gè)數(shù)字0開(kāi)始,沿著逆時(shí)針?lè)较驍?shù)字遞增,直到最后一個(gè)數(shù)字(2^32)-1。因此,在環(huán)形空間中,第一個(gè)數(shù)字與最后一個(gè)數(shù)字鄰接。
根據(jù)定時(shí)任務(wù)ID的哈希值,將定時(shí)任務(wù)ID映射在環(huán)形空間的相應(yīng)位置,如圖4a所示。
在步驟S13中,調(diào)度模塊計(jì)算定時(shí)器模塊ID的哈希值,并且將其映射到上述的環(huán)形空間中。
在分布式定時(shí)任務(wù)調(diào)度系統(tǒng)中,定時(shí)器模塊負(fù)載執(zhí)行具體的任務(wù)調(diào)度。每個(gè)定時(shí)器模塊在啟動(dòng)之后,都在分布式服務(wù)框架上注冊(cè)自己的定時(shí)器模塊ID。因此,在環(huán)形空間中映射多個(gè)定時(shí)器模塊ID。
在步驟S14中,調(diào)度模塊按順時(shí)鐘方向,將定時(shí)任務(wù)分配給最近的定時(shí)器模塊,如圖4b所示。
在圖4b中示出定時(shí)器模塊A和B在環(huán)形空間中分別位于不同位置。定時(shí)任務(wù)A在環(huán)形空間中位于定時(shí)器模塊A和B之間。由于按順時(shí)鐘方向最近的定時(shí)器模塊為A,因此調(diào)度模塊將定時(shí)任務(wù)A分配給定時(shí)器模塊A。
然后,調(diào)度模塊向選定的定時(shí)器模塊發(fā)送時(shí)間規(guī)則,并且啟動(dòng)定時(shí)。
在上述的實(shí)施例中,描述了分布式定時(shí)任務(wù)調(diào)度方法中添加任務(wù)的步驟。
在一個(gè)優(yōu)選的實(shí)施例中,該分布式定時(shí)任務(wù)調(diào)度方法還允許刪除定時(shí)任務(wù)。在刪除定時(shí)任務(wù)時(shí),調(diào)度模塊根據(jù)定時(shí)任務(wù)ID在數(shù)據(jù)庫(kù)中查詢(xún)相關(guān)聯(lián)的定時(shí)器模塊ID,然后調(diào)用定時(shí)器模塊的刪除接口結(jié)束該定時(shí)任務(wù),并且從環(huán)形空間中刪除相應(yīng)的定時(shí)任務(wù)ID。
在另一個(gè)優(yōu)選的實(shí)施例中,該分布式定時(shí)任務(wù)調(diào)度方法還允許修改定時(shí)任務(wù)。在修改定時(shí)任務(wù)時(shí),調(diào)度模塊在環(huán)形空間中保留相應(yīng)的定時(shí)任務(wù)ID及關(guān)聯(lián)的定時(shí)器模塊ID,調(diào)度模塊指示相關(guān)聯(lián)的定時(shí)器模塊結(jié)束該定時(shí)任務(wù),然后重新向選定的定時(shí)器模塊發(fā)送時(shí)間規(guī)則,并且重新啟動(dòng)定時(shí)。
圖5示出根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度方法中重新分配任務(wù)的流程圖。相應(yīng)地,圖6a至6c示出根據(jù)本發(fā)明實(shí)施例的分布式定時(shí)任務(wù)調(diào)度方法中重新分配任務(wù)的不同步驟的示意圖。
在步驟S21中,在分布式定時(shí)任務(wù)調(diào)度中,調(diào)度模塊負(fù)責(zé)監(jiān)聽(tīng)定時(shí)器模塊ID的節(jié)點(diǎn)變化。
在圖6a中示出定時(shí)器模塊ID的節(jié)點(diǎn)的初始狀態(tài)。根據(jù)哈希一致性算法可以獲得定時(shí)器模塊A、B和C以及定時(shí)任務(wù)A、B和C在環(huán)形空間中的位置。定時(shí)任務(wù)A和B在環(huán)形空間中位于定時(shí)器模塊A和B之間,定時(shí)任務(wù)C在環(huán)形空間中位于定時(shí)器模塊B和C之間。對(duì)于定時(shí)任務(wù)A和B而言,由于按順時(shí)鐘方向最近的定時(shí)器模塊為A,因此調(diào)度模塊將定時(shí)任務(wù)A和B分配給定時(shí)器模塊A。對(duì)于定時(shí)任務(wù)C而言,由于按順時(shí)鐘方向最近的定時(shí)器模塊為B,因此調(diào)度模塊將定時(shí)任務(wù)C分配給定時(shí)器模塊B。
在步驟S22中,在定時(shí)器模塊ID的節(jié)點(diǎn)變化時(shí),分布式服務(wù)框架產(chǎn)生回調(diào)事件。該回調(diào)事件報(bào)告定時(shí)器模塊ID的節(jié)點(diǎn)數(shù)量增加或減少。定時(shí)器模塊ID的節(jié)點(diǎn)數(shù)量增加時(shí)意味著系統(tǒng)增加定時(shí)器模塊,定時(shí)器模塊ID的節(jié)點(diǎn)數(shù)量減少時(shí)意味著可能人為終止定時(shí)器任務(wù),或由于程序故障導(dǎo)致定時(shí)器任務(wù)終止。
在圖6b和6c中分別示出定時(shí)器模塊ID的節(jié)點(diǎn)增加和減少的變化情形。參見(jiàn)圖6b,定時(shí)器模塊D是新增的節(jié)點(diǎn),該節(jié)點(diǎn)ID的哈希值在環(huán)形空間中插入到定時(shí)任務(wù)A和B之間。參見(jiàn)圖6c,定時(shí)器模塊B是刪除的節(jié)點(diǎn),該節(jié)點(diǎn)ID的哈希值在環(huán)形空間中的初始位置位于定時(shí)任務(wù)B和C之間。
在步驟S23中,在監(jiān)聽(tīng)到回調(diào)事件時(shí),不論定時(shí)器模塊ID的節(jié)點(diǎn)數(shù)量增加還是減少,調(diào)度模塊重新分配任務(wù)。
參見(jiàn)圖6b,在定時(shí)器模塊ID的節(jié)點(diǎn)數(shù)量增加的情形下,調(diào)度模塊監(jiān)聽(tīng)到節(jié)點(diǎn)數(shù)量的變化,從而檢測(cè)到定時(shí)器模塊D是新增的節(jié)點(diǎn)。調(diào)度模塊根據(jù)哈希一致性算法可以獲得定時(shí)器模塊D在環(huán)形空間中的位置。定時(shí)任務(wù)A和C按順時(shí)鐘方向最近的定時(shí)器模塊分別為定時(shí)器模塊A和B,與圖6a所示的初始位置關(guān)系相比未發(fā)生變化。定時(shí)任務(wù)B按順時(shí)鐘方向最近的定時(shí)器模塊則發(fā)生變化,從初始的定時(shí)器模塊A變?yōu)樾略龅亩〞r(shí)器模塊D。因此,調(diào)度模塊指示定時(shí)器模塊A結(jié)束定時(shí)任務(wù)B,并且重新將定時(shí)任務(wù)B分配給新的定時(shí)器模塊D。
參見(jiàn)圖6c,在定時(shí)器模塊ID的節(jié)點(diǎn)數(shù)量減少的情形下,調(diào)度模塊監(jiān)聽(tīng)到節(jié)點(diǎn)數(shù)量的變化,從而檢測(cè)到定時(shí)器模塊B是刪除的節(jié)點(diǎn)。定時(shí)任務(wù)A和B按順時(shí)鐘方向最近的定時(shí)器模塊仍然為定時(shí)器模塊A,與圖4a所示的初始位置關(guān)系相比未發(fā)生變化。定時(shí)任務(wù)C按順時(shí)鐘方向最近的定時(shí)器模塊則發(fā)生變化,從初始的定時(shí)器模塊B變?yōu)槎〞r(shí)器模塊A。因此,調(diào)度模塊重新將定時(shí)任務(wù)C分配給定時(shí)器模塊A。
根據(jù)上述實(shí)施例的分布式定時(shí)任務(wù)調(diào)度方法,定時(shí)任務(wù)集合能夠按照一定規(guī)則分布到不同定時(shí)器模塊上。在系統(tǒng)運(yùn)行期間可以動(dòng)態(tài)增減定時(shí)器模塊,并且能夠重新分配定時(shí)任務(wù)到不同定時(shí)器模塊上。在定時(shí)器模塊增減時(shí),可以保證定時(shí)任務(wù)重新分配期間沒(méi)有執(zhí)行的定時(shí)任務(wù)在分配完成后能夠重新執(zhí)行。該分布式定時(shí)任務(wù)調(diào)度方法允許動(dòng)態(tài)增減定時(shí)任務(wù),因此可以通過(guò)web系統(tǒng)對(duì)定時(shí)任務(wù)進(jìn)行管理,如增加、修改、刪除定時(shí)任務(wù),查看定時(shí)任務(wù)執(zhí)行情況等等,從而可以提高系統(tǒng)效率和改善用戶(hù)體驗(yàn)。
上述分布式定時(shí)任務(wù)調(diào)度系統(tǒng)的各個(gè)模塊或單元可以通過(guò)硬件、固件或軟件實(shí)現(xiàn)。軟件例如包括采用JAVA、C/C++/C#、SQL等各種編程語(yǔ)言形成的編碼程序。雖然在方法以及方法圖例中給出本發(fā)明實(shí)施例的步驟以及步驟的順序,但是所述步驟實(shí)現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令可以重新組合,從而生成新的步驟。所述步驟的順序也不應(yīng)該僅僅局限于所述方法以及方法圖例中的步驟順序,可以根據(jù)功能的需要隨時(shí)進(jìn)行調(diào)整。例如將其中的某些步驟并行或按照相反順序執(zhí)行。
根據(jù)本發(fā)明的系統(tǒng)和方法可以部署在單個(gè)或多個(gè)服務(wù)器上。例如,可以將不同的模塊分別部署在不同的服務(wù)器上,形成專(zhuān)用服務(wù)器?;蛘撸梢栽诙鄠€(gè)服務(wù)器上分布式部署相同的功能單元、模塊或系統(tǒng),以減輕負(fù)載壓力。所述服務(wù)器包括但不限于在同一個(gè)局域網(wǎng)以及通過(guò)Internet連接的多個(gè)PC機(jī)、PC服務(wù)器、刀片機(jī)、超級(jí)計(jì)算機(jī)等。
以上所述僅為本發(fā)明的優(yōu)選實(shí)施例,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域技術(shù)人員而言,本發(fā)明可以有各種改動(dòng)和變化。凡在本發(fā)明的精神和原理之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。