分布式任务调度技术选型

背景

因为我是在一家银行外包的公司做开发,我们公司接了一个类电商的项目,背靠银行针对于地方的惠民app。上线一个月,我们接了新的需求,双12做一些促销活动,且需要根据用户画像生成不同的推送内容。
当时我们总共有50万用户左右。
经测试,通过Spring Task和分布式锁,单台机器同时开启5个线程,执行时间需要27个小时左右,即便开10个线程,需要14个小时左右,显然执行时间过长。

解决方案

当时个推服务部署节点有3台,在每年大促期间可动态扩容,显然通过上述方案是行不通的,其余的机器资源没有充分利用起来。

要想短时间内完成推送,那么就得想办法让每台机器各自分一部分用户数据去执行,这样效率可提高原来的N倍。

核心思想如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oIvQFEJx-1678585433218)(基于XXL-JOB实现分布式任务调度的实现.assets/image-20220702101854742.png)]

经过调研现有的开源的分布式任务调度框架,决定在elastic-job和xxl-job中选一个

Elastic Job是当当网开源一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成;定位为轻量级无中心化解决方案,使用 jar 包的形式提供分布式任务的协调服务。支持分布式调度协调、弹性扩容缩容、失效转移、错过执行作业重触发、并行调度、自诊断和修复等等功能特性。

XXL-Job官网是大众点评发布的分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

更倾向于选择XXL-JOB:

  1. 轻量级,支持通过Web页面对任务进行动态CRUD操作,操作简单
  2. 只依赖数据库作为集群注册中心,接入开发简单,不需要ZK
  3. 高可用、解耦、高性能、监控报警、分片、重试、故障转移
  4. 团队持续开发,社区活跃
  5. 支持后台直接查看每个任务执行实时日志
具体实现
在项目中集成xxl-job客户端
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.2.0</version>
</dependency>
在配置文件中配置xxl-job信息
xxl:
  job:
    accessToken:
    admin:
      addresses: http://xxl部署IP地址:8080/xxl-job-admin
    executor:
      appname: vm-service
      address:
      ip:
      port: 9989
      logretentiondays: 30
在xxl-job中新增执行器

注册方式选自动注册,这样方便动态扩容

在这里插入图片描述

创建任务

路由策略选择分片广播

在这里插入图片描述

代码部分

在任务代码获取推送用户时,根据当前的分片及分片总数对用户ID取余,这样我们就可以在每个分片节点,获取不一样的数据。id值越连续,分片则越均匀。

 ShardingUtil.ShardingVO shardingVo = ShardingUtil.getShardingVo();
 int numbers = shardingVo.getTotal();  //分片总数
 int index = shardingVo.getIndex(); //当前分片索引

假设分片总数为3,当前节点获取到的分片索引为0,那么查询推送用户SQL如下:

SELECT user_id FROM `user_info` WHERE MOD(user_id,3)=0 

我们在实际代码中,分片总数和当前分片索引是以参数的形式传给查询的SQL语句的。

如上,即可完成分布式任务。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。 Quartz的优势: 1、Quartz是一个任务调度框架(库),它几乎可以集成到任何应用系统中。 2、Quartz是非常灵活的,它让您能够以最“自然”的方式来编写您的项目的代码,实现您所期望的行为 3、Quartz是非常轻量级的,只需要非常少的配置 —— 它实际上可以被跳出框架来使用,如果你的需求是一些相对基本的简单的需求的话。 4、Quartz具有容错机制,并且可以在重启服务的时候持久化(”记忆”)你的定时任务,你的任务也不会丢失。 5、可以通过Quartz,封装成自己的分布式任务调度,实现强大的功能,成为自己的产品。6、有很多的互联网公司也都在使用Quartz。比如美团 Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度。   课程说明:在我们的日常开发中,各种大型系统的开发少不了任务调度,简单的单机任务调度已经满足不了我们的系统需求,复杂的任务会让程序猿头疼, 所以急需一套专门的框架帮助我们去管理定时任务,并且可以在多台机器去执行我们的任务,还要可以管理我们的分布式定时任务。本课程从Quartz框架讲起,由浅到深,从使用到结构分析,再到源码分析,深入解析Quartz、Spring+Quartz,并且会讲解相关原理, 让大家充分的理解这个框架和框架的设计思想。由于互联网的复杂性,为了满足我们特定的需求,需要对Spring+Quartz进行二次开发,整个二次开发过程都会进行讲解。Spring被用在了越来越多的项目中, Quartz也被公认为是比较好用的定时器设置工具,学完这个课程后,不仅仅可以熟练掌握分布式定时任务,还可以深入理解大型框架的设计思想。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值