背景
笔者以前在电商公司,我们需要在8月18号做大促活动,我们会提前一天给所有的用户推送活动信息,且需要根据用户画像生成不同的推送内容。
当时我们总共有80万用户左右。
经测试,通过Spring Task和分布式锁,单台机器同时开启5个线程,执行时间需要27个小时左右,即便开10个线程,需要14个小时左右,显然执行时间过长。
解决方案
当时个推服务部署节点有3台,在每年大促期间可动态扩容,其余的机器资源没有充分利用起来。
要想短时间内完成推送,那么就得想办法让每台机器各自分一部分用户数据去执行,这样效率可提高原来的N倍。
那么就需要分布式任务去执行,核心思想如下图:
经过调研现有的开源的分布式任务调度框架,决定在elastic-job和xxl-job中选一个
Elastic Job是当当网开源一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成;定位为轻量级无中心化解决方案,使用 jar 包的形式提供分布式任务的协调服务。支持分布式调度协调、弹性扩容缩容、失效转移、错过执行作业重触发、并行调度、自诊断和修复等等功能特性。
XXL-Job官网是大众点评发布的分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
更倾向于选择XXL-JOB:
-
轻量级,支持通过Web页面对任务进行动态CRUD操作,操作简单
-
只依赖数据库作为集群注册中心,接入开发简单,不需要ZK
-
高可用、解耦、高性能、监控报警、分片、重试、故障转移
-
团队持续开发,社区活跃
-
支持后台直接查看每个任务执行实时日志
具体实现
在项目中集成xxl-job客户端
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
在配置文件中配置xxl-job信息
xxl:
job