CN114327837A - 一种基于消息队列的分布式任务调度运行系统及方法 - Google Patents
一种基于消息队列的分布式任务调度运行系统及方法 Download PDFInfo
- 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
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,数据格式如下:
{
"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中,由日志收集器分别记录运行过程中的日志,日志信息包括主机名、组件名、日志级别、日志信息;日志通过通用的日志组件发送至日志消息队列,由其他的日志系统分析。
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)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115941548A (zh) * | 2022-09-23 | 2023-04-07 | 深圳依时货拉拉科技有限公司 | 消费者的消费延迟时间确定方法和装置 |
WO2024020743A1 (zh) * | 2022-07-25 | 2024-02-01 | 苏州中科天启遥感科技有限公司 | 数据生产的主从集群任务调度方法及应用 |
-
2022
- 2022-01-06 CN CN202210007678.7A patent/CN114327837A/zh active Pending
Cited By (2)
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 |