CN114327837A - 一种基于消息队列的分布式任务调度运行系统及方法 - Google Patents

一种基于消息队列的分布式任务调度运行系统及方法 Download PDF

Info

Publication number
CN114327837A
CN114327837A CN202210007678.7A CN202210007678A CN114327837A CN 114327837 A CN114327837 A CN 114327837A CN 202210007678 A CN202210007678 A CN 202210007678A CN 114327837 A CN114327837 A CN 114327837A
Authority
CN
China
Prior art keywords
task
queue
message
execution
distributed
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202210007678.7A
Other languages
English (en)
Inventor
孙纪福
庞景秋
李绍俊
齐井春
张少卓
李波
李忆平
陈兴钰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Changchun Jiacheng Information Technology Co ltd
Original Assignee
Changchun Jiacheng Information Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Changchun Jiacheng Information Technology Co ltd filed Critical Changchun Jiacheng Information Technology Co ltd
Priority to CN202210007678.7A priority Critical patent/CN114327837A/zh
Publication of CN114327837A publication Critical patent/CN114327837A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种基于消息队列的分布式任务调度运行系统及方法,一种基于消息队列的分布式任务调度运行系统,包括API网关、任务调度器、消息队列、分布式任务执行、日志收集器,API网关的输出端通过任务调度器与消息队列相连接,消息队列将消息传输给分布式任务执行,API网关、消息队列、分布式任务执行分别与日志收集器数据相接。一种基于消息队列的分布式任务调度运行系统的方法,运行方法包括以下步骤:任务接收;消息队列;任务调度;任务执行;失败重试;日志收集。本发明采用拉取方式获取任务,从源头解决任务执行器端阻塞的问题,减小了任务调度器的压力,同时可以根据资源管理动态扩缩容,从而增加了资源的使用率。

Description

一种基于消息队列的分布式任务调度运行系统及方法
技术领域
本发明涉及一种运行系统及方法,尤其涉及一种基于消息队列的分布式任务调度运行系统及方法。
背景技术
互联网应用或者企业级应用,都充斥着大量的批处理任务,在此基础上分布式任务调度运行应运而生。分布式调度运行的并行性能、任务执行可靠性、任务资源的管理都是分布式调度需要解决的问题。
传统的分布式任务调度系统由任务调度器将任务推送给执行器运行,推送模式存在以下问题:
1)调度器在推送任务之前确认目标执行器空闲状态,当执行器集群数量很多时,快速遍历算法异常复杂,不当的算法容易使任务执行器端出现阻塞,负载不均衡。
2)调度器无法管理数据太大的执行器,调度器将成为分布式调度的性能瓶颈。
发明内容
为了解决上述技术所存在的不足之处,本发明提供了一种基于消息队列的分布式任务调度运行系统及方法。
为了解决以上技术问题,本发明采用的技术方案是:一种基于消息队列的分布式任务调度运行系统,包括API网关、任务调度器、消息队列、分布式任务执行、日志收集器,API网关的输出端通过任务调度器与消息队列相连接,消息队列将消息传输给分布式任务执行,API网关、消息队列、分布式任务执行分别与日志收集器数据相接。
优选的,API网关将接收到的新任务传输给任务调度器;
任务调度器读取API网关接收的任务并将任务传输给消息队列;
消息队列根据消息状态将消息分列;
分布式任务执行从消息队列中拉取消息,根据任务类型执行任务脚本,并根据执行结果将任务存储到指定队列。
一种基于消息队列的分布式任务调度运行系统的方法,运行方法包括以下步骤:
步骤S1、任务接收;
步骤S2、消息队列;
步骤S3、任务调度;
步骤S4、任务执行;
步骤S5、失败重试;
步骤S6、日志收集。
优选的,步骤S1的具体过程为:第三方系统将任务批量发送给运行系统,每个任务包含元数据描述信息:任务名称、任务类型、任务脚本,运行系统收妥后会生成任务批次号,并给每个任务生成唯一的任务ID。
优选的,步骤S2中,运行系统中内置4个任务相关的消息队列:待办队列、完成队列、重试队列、异常队列;
其中,消息的存储形式为一个三层的结构:队列、分区、消息;
每一条消息只会保存在某个分区中,队列分区数在系统启动时预制,运行期只可以增加不可以减少;
每个分区都有一个高水平位记录最大的消息位置,同时有一个记录已经消费的偏移量。
优选的,步骤S3的具体过程为:
任务调度器从数据库中读取未处理的任务,将任务转换成json字符串发送给待办队列,任务发送成功后更新任务的状态为等待执行;
发送消息前任务调度器先获取待办队列数据,待办队列数据包括分区数量、分区高水平位、消费偏移量;
其中,默认调度分配策略为:
S31、计算每分区未处理消息数量=高水平位-消费偏移量;
S32、计算待办队列未处理消息数量总和;
S33、离散因子=1-计算每分区未处理消息占队列未处理消息数量百分比;
S34、根据离散因子大小,较大离散因子将分到更多的消息。
优选的,步骤S4中,任务执行器以docker的形式部署在多台物理机或k8s集群中,多个任务执行器共享一个订阅消费组,消费组屏蔽任务执行器和队列分区的直接联系,并维护各队列分区已经消费的偏移量。
优选的,步骤S4中任务执行步骤如下:
S41、从消费组中获取消息,并将json字符串转化为任务实例;
S42、将任务更新为正在执行状态,设置开始执行时间;
S43、获取任务ID,以任务ID创建临时工作目录;
S44、从任务实例中获取任务脚本,在工作目录中创建文件;
S45、启动执行进程运行任务,等待进程返回结果;
S46、执行进程返回结果后,设置任务执行状态、任务结束时间,并计算任务执行耗时;
S47、任务执行状态为成功的,将任务发送至完成队列;状态为失败的将任务发送至重试队列。
优选的,步骤S5针对运行失败的任务,增加重试机制,为了不影响正常待办任务的执行,为失败任务增加了重试任务执行器;
其中,重试机制为:
S51、重试任务执行器从重试队列中获取任务,按正常任务执行器中任务运行逻辑执行;
S52、如果执行成功,将任务发送至完成队列;
S53、如果仍然执行失败,将重试次数加1;
S54、如果重试次数>3次,将任务发送至异常队列,反之将任务重新发送至重试队列。
优选的,步骤S6中,由日志收集器分别记录运行过程中的日志,日志信息包括主机名、组件名、日志级别、日志信息;日志通过通用的日志组件发送至日志消息队列,由其他的日志系统分析。
本发明的任务执行器采用拉取方式获取任务,一个任务执行器在运行期只允许一个任务运行,从源头解决任务执行器端阻塞的问题,减小了任务调度器的压力,同时执行器集群可以按需增减其复本数量,任务执行器可以根据资源管理动态扩缩容,从而增加了资源的使用率。
附图说明
图1为本发明分布式任务调度运行系统结构图。
图2为任务存储结构图。
图3为任务执行示意图。
图4为任务失败后重试流程图。
具体实施方式
下面结合附图和具体实施方式对本发明作进一步详细的说明。
如图1所示的一种基于消息队列的分布式任务调度运行系统,包括API网关、任务调度器、消息队列、分布式任务执行、日志收集器,API网关的输出端通过任务调度器与消息队列相连接,消息队列将消息传输给分布式任务执行,API网关、消息队列、分布式任务执行分别与日志收集器数据相接。
其中,API网关将接收到的新任务传输给任务调度器;API网关负责接收第三方新任务请求并存储到数据库,查询任务调度、运行状态。(注:API网关是一个服务器,是系统的唯一入口。)
任务调度器读取API网关接收的任务并将任务传输给消息队列;任务调度器读取API网关接收的任务,根据消息队列各分区剩余任务数量平均分配置消息。
消息队列根据消息状态将消息分列;消息队列用来存储消息,根据消息的状态分为待办队列、完成队列、重试队列、异常队列。
分布式任务执行从消息队列中拉取消息,根据任务类型执行任务脚本,并根据执行结果将任务存储到指定队列。
一种基于消息队列的分布式任务调度运行系统的方法,运行方法包括以下步骤:
步骤S1、任务接收;
第三方系统将任务批量发送给运行系统,每个任务包含元数据描述信息:任务名称、任务类型、任务脚本,运行系统收妥后会生成任务批次号,并给每个任务生成唯一的任务ID。
步骤S2、消息队列;
运行系统中内置4个任务相关的消息队列:待办队列、完成队列、重试队列、异常队列;
其中,以待办队列为例,消息队列的存储结构如图2所示:
消息的存储形式为一个三层的结构:队列、分区、消息;
每一条消息只会保存在某个分区中,队列分区数在系统启动时预制,运行期只可以增加不可以减少;
每个分区都有一个高水平位记录最大的消息位置,同时有一个记录已经消费的偏移量。
步骤S3、任务调度;
任务调度器从数据库中读取未处理的任务,将任务转换成json字符串发送给待办队列,任务发送成功后更新任务的状态为等待执行;
注:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,为现有技术,此处不再赘述。
发送消息前任务调度器先获取待办队列数据,待办队列数据包括分区数量、分区高水平位、消费偏移量;
其中,默认调度分配策略为:
S31、计算每分区未处理消息数量=高水平位-消费偏移量;
S32、计算待办队列未处理消息数量总和;
S33、离散因子=1-计算每分区未处理消息占队列未处理消息数量百分比;
S34、根据离散因子大小,较大离散因子将分到更多的消息。
步骤S4、任务执行;
任务执行器以docker的形式部署在多台物理机或k8s集群中,多个任务执行器共享一个订阅消费组,消费组屏蔽任务执行器和队列分区的直接联系,并维护各队列分区已经消费的偏移量,如图3所示。
注:Docker是一个开源的应用容器引擎;
kubernetes是google开源的容器集群管理系统,提供应用部署、维护、扩展机制等功能,利用kubernetes能方便管理跨集群运行容器化的应用,简称:k8s(k与s之间有8个字母),docker、k8s均为现有技术,此处不再赘述。
其中,任务执行步骤如下:
S41、从消费组中获取消息,并将json字符串转化为任务实例;
S42、将任务更新为正在执行状态,设置开始执行时间;
S43、获取任务ID,以任务ID创建临时工作目录;
S44、从任务实例中获取任务脚本,在工作目录中创建文件;
S45、启动执行进程运行任务,等待进程返回结果;
S46、执行进程返回结果后,设置任务执行状态、任务结束时间,并计算任务执行耗时;
S47、任务执行状态为成功的,将任务发送至完成队列;状态为失败的将任务发送至重试队列。
步骤S5、失败重试;
针对运行失败的任务,增加重试机制,为了不影响正常待办任务的执行,为失败任务增加了重试任务执行器;
其中,如图4所示,重试机制为:
S51、重试任务执行器从重试队列中获取任务,按正常任务执行器中任务运行逻辑执行;
S52、如果执行成功,将任务发送至完成队列;
S53、如果仍然执行失败,将重试次数加1;
S54、如果重试次数>3次(由系统最大重试次数参数控制),将任务发送至异常队列,反之将任务重新发送至重试队列。
步骤S6、日志收集。
由日志收集器分别记录运行过程中的日志,日志信息包括主机名(docker中生成的随机主机标识)、组件名、日志级别、日志信息;日志通过通用的日志组件发送至日志消息队列,由其他的日志系统分析。
下面结合具体实施例对本发明作进一步详细的说明。
实施例
业务场景:对历史数据文件使用SM4算法(SM4分组密码算法)加密,每个文件有唯一标识,文件大小在10K-25K,历史数据文件总数量2亿,数据文件分散存储在mongo数据库(MongoDB是一个基于分布式文件存储的数据库)200个集合中,加密后数据存储在新的mongo数据库中,集合名称与原集合相同。
1.部署分布式任务调度运行系统,环境包含1个API服务、1个消息队列服务器、200个任务执行器。
2.根据业务要求编写处理脚本,脚本包含数据库读取、数据加密、数据库写入,可以传入文件唯一标识。调用API接口将脚本上传至服务器,API服务返回脚本ID。
3.客户端连接数据库,生成任务,数据格式为json,数据格式如下:
Figure BDA0003457605020000071
Figure BDA0003457605020000081
{
"batchId":"85eb9b91-6882-42a8-86ed-9f465edb781e",
"name":"encryption-64aa7149-484d-11ec-8b32-3cd2e55f9724",
"scriptId":"2864fe2a-484d-11ec-8b32-3cd2e55f9724",
"submitTime":1631946229342,
"taskType":"PYTHON",
"param":"{\"args\":{},\"kwargs\":{\"id\":\"64aa7149-484d-11ec-8b32-3cd2e55f9724\"}}"
}
4.API服务接收任务数据后,向消息队列待办队列task_todo发送数据。
5.所有任务执行器监听待办队列,拉取任务按执行步骤执行;任务处理完成后将数据写入完成队列task_done。
6.因数据库读取写入异常的写入重试队列task_retry,并按重试逻辑处理,最终仍失败数据写入异常队列task_error。
7.任务执行过程中所有日志写入日志队列task_log,由其他日志系统分析。
上述实施方式并非是对本发明的限制,本发明也并不仅限于上述举例,本技术领域的技术人员在本发明的技术方案范围内所做出的变化、改型、添加或替换,也均属于本发明的保护范围。

Claims (10)

1.一种基于消息队列的分布式任务调度运行系统,其特征在于:所述运行系统包括API网关、任务调度器、消息队列、分布式任务执行、日志收集器,所述API网关的输出端通过任务调度器与消息队列相连接,所述消息队列将消息传输给分布式任务执行,所述API网关、消息队列、分布式任务执行分别与日志收集器数据相接。
2.根据权利要求1所述的基于消息队列的分布式任务调度运行系统,其特征在于:
所述API网关将接收到的新任务传输给任务调度器;
所述任务调度器读取API网关接收的任务并将任务传输给消息队列;
所述消息队列根据消息状态将消息分列;
所述分布式任务执行从消息队列中拉取消息,根据任务类型执行任务脚本,并根据执行结果将任务存储到指定队列。
3.一种如权利要求1或2所述的基于消息队列的分布式任务调度运行系统的方法,其特征在于:所述运行方法包括以下步骤:
步骤S1、任务接收;
步骤S2、消息队列;
步骤S3、任务调度;
步骤S4、任务执行;
步骤S5、失败重试;
步骤S6、日志收集。
4.根据权利要求3所述的基于消息队列的分布式任务调度运行系统的方法,其特征在于:所述步骤S1的具体过程为:第三方系统将任务批量发送给运行系统,每个任务包含元数据描述信息:任务名称、任务类型、任务脚本,运行系统收妥后会生成任务批次号,并给每个任务生成唯一的任务ID。
5.根据权利要求3所述的基于消息队列的分布式任务调度运行系统的方法,其特征在于:所述步骤S2中,运行系统中内置4个任务相关的消息队列:待办队列、完成队列、重试队列、异常队列;
其中,消息的存储形式为一个三层的结构:队列、分区、消息;
每一条消息只会保存在某个分区中,队列分区数在系统启动时预制,运行期只可以增加不可以减少;
每个分区都有一个高水平位记录最大的消息位置,同时有一个记录已经消费的偏移量。
6.根据权利要求3所述的基于消息队列的分布式任务调度运行系统的方法,其特征在于:所述步骤S3的具体过程为:
任务调度器从数据库中读取未处理的任务,将任务转换成json字符串发送给待办队列,任务发送成功后更新任务的状态为等待执行;
发送消息前任务调度器先获取待办队列数据,待办队列数据包括分区数量、分区高水平位、消费偏移量;
其中,默认调度分配策略为:
S31、计算每分区未处理消息数量=高水平位-消费偏移量;
S32、计算待办队列未处理消息数量总和;
S33、离散因子=1-计算每分区未处理消息占队列未处理消息数量百分比;
S34、根据离散因子大小,较大离散因子将分到更多的消息。
7.根据权利要求3所述的基于消息队列的分布式任务调度运行系统的方法,其特征在于:所述步骤S4中,任务执行器以docker的形式部署在多台物理机或k8s集群中,多个任务执行器共享一个订阅消费组,消费组屏蔽任务执行器和队列分区的直接联系,并维护各队列分区已经消费的偏移量。
8.根据权利要求7所述的基于消息队列的分布式任务调度运行系统的方法,其特征在于:所述步骤S4中任务执行步骤如下:
S41、从消费组中获取消息,并将json字符串转化为任务实例;
S42、将任务更新为正在执行状态,设置开始执行时间;
S43、获取任务ID,以任务ID创建临时工作目录;
S44、从任务实例中获取任务脚本,在工作目录中创建文件;
S45、启动执行进程运行任务,等待进程返回结果;
S46、执行进程返回结果后,设置任务执行状态、任务结束时间,并计算任务执行耗时;
S47、任务执行状态为成功的,将任务发送至完成队列;状态为失败的将任务发送至重试队列。
9.根据权利要求3所述的基于消息队列的分布式任务调度运行系统的方法,其特征在于:所述步骤S5针对运行失败的任务,增加重试机制,为了不影响正常待办任务的执行,为失败任务增加了重试任务执行器;
其中,重试机制为:
S51、重试任务执行器从重试队列中获取任务,按正常任务执行器中任务运行逻辑执行;
S52、如果执行成功,将任务发送至完成队列;
S53、如果仍然执行失败,将重试次数加1;
S54、如果重试次数>3次,将任务发送至异常队列,反之将任务重新发送至重试队列。
10.根据权利要求3所述的基于消息队列的分布式任务调度运行系统的方法,其特征在于:所述步骤S6中,由日志收集器分别记录运行过程中的日志,日志信息包括主机名、组件名、日志级别、日志信息;日志通过通用的日志组件发送至日志消息队列,由其他的日志系统分析。
CN202210007678.7A 2022-01-06 2022-01-06 一种基于消息队列的分布式任务调度运行系统及方法 Pending CN114327837A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210007678.7A CN114327837A (zh) 2022-01-06 2022-01-06 一种基于消息队列的分布式任务调度运行系统及方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210007678.7A CN114327837A (zh) 2022-01-06 2022-01-06 一种基于消息队列的分布式任务调度运行系统及方法

Publications (1)

Publication Number Publication Date
CN114327837A true CN114327837A (zh) 2022-04-12

Family

ID=81025006

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210007678.7A Pending CN114327837A (zh) 2022-01-06 2022-01-06 一种基于消息队列的分布式任务调度运行系统及方法

Country Status (1)

Country Link
CN (1) CN114327837A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115941548A (zh) * 2022-09-23 2023-04-07 深圳依时货拉拉科技有限公司 消费者的消费延迟时间确定方法和装置
WO2024020743A1 (zh) * 2022-07-25 2024-02-01 苏州中科天启遥感科技有限公司 数据生产的主从集群任务调度方法及应用

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024020743A1 (zh) * 2022-07-25 2024-02-01 苏州中科天启遥感科技有限公司 数据生产的主从集群任务调度方法及应用
CN115941548A (zh) * 2022-09-23 2023-04-07 深圳依时货拉拉科技有限公司 消费者的消费延迟时间确定方法和装置

Similar Documents

Publication Publication Date Title
CN108376118B (zh) 服务发布系统、方法、设备及存储介质
CN114327837A (zh) 一种基于消息队列的分布式任务调度运行系统及方法
US11157324B2 (en) Partitioning for delayed queues in a distributed network
US10133797B1 (en) Distributed heterogeneous system for data warehouse management
US8898680B2 (en) System and method for supporting asynchronous message processing in a distributed data grid
US20160275123A1 (en) Pipeline execution of multiple map-reduce jobs
US20200159841A1 (en) Approach for a controllable trade-off between cost and availability of indexed data in a cloud log aggregation solution such as splunk or sumo
CN105138615A (zh) 一种构建大数据分布式日志的方法和系统
WO2017181872A1 (zh) 数据处理系统以及方法
CN112463290A (zh) 动态调整计算容器的数量的方法、系统、装置和存储介质
CN113391890A (zh) 一种任务处理方法、装置、设备和计算机存储介质
CN103581332A (zh) HDFS架构及HDFS架构中NameNode节点的压力分解方法
WO2020216077A1 (zh) 一种区块链事件去重方法、装置、计算机设备及存储介质
WO2022247316A1 (zh) 存储对象处理系统、请求处理方法、网关和存储介质
CN113422842A (zh) 一种考虑网络负载的分布式电力用电信息数据采集系统
CN105761039A (zh) 快递信息大数据处理方法
CN114168262B (zh) 一种基于lru置换算法的云平台镜像缓存管理方法
CN112559461A (zh) 文件传输方法及装置、存储介质及电子设备
CN114063936B (zh) 一种优化定时任务的方法、系统、设备和存储介质
CN115426361A (zh) 分布式客户端打包方法、装置、主服务器及存储介质
CN112948096A (zh) 一种批量调度方法、装置和设备
EP3709173B1 (en) Distributed information memory system, method, and program
CN108989465B (zh) 共识方法、服务器、存储介质及分布式系统
WO2023043370A2 (en) Method and apparatus for sending logs, and log management system
CN104618484A (zh) 一种基于键值对的横向扩展的高性能存储方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination