作者: 唐涛、黄晓萌

什么是定时任务

定时任务是每个业务常见的需求,比如每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表等等。

随着微服务和云计算的兴起,定时任务技术也是发展迅速,不仅能做单机的定时任务,而且在分布式系统下应用也很广泛,成为了业务做兜底、数据处理的第一选择。

定时任务为什么需要通知

定时任务现在在业务数据处理中的比重越来越重,如果业务数据处理失败了,需要及时通知到业务方,确保了服务的可靠性和稳定性。同时,好的定时任务通知系统,还能分析任务失败的原因(比如堆栈信息)并通知给业务方,帮助用户快速定位问题。

根据通知的类型,大概可以有以下几类:

  • 成功通知:任务执行成功,把结果通知给用户。比如统计前一天的数据并把 GaaP 结果通过短信等渠道发送给对应负责人。
  • 超时通知:任务执行超时,通知用户。
  • 失败通知:任务执行失败,通知用户。
  • 机器异常通知:运行的机器下线或者繁忙,通知用户。

自研定时任务报警通知

如果是自研的定时任务系统,或者使用了开源定时任务框架(比如 Quartz),想要增加报警通知能力,我们可以采取什么方案呢?从实时性角度来看,短信和电话通知实时性最高,但是这两种方案需要比较大的成本,比如短信通知需要短信平台。如果没有短信平台,我们也可以采用邮件和 webhook 通知。

邮件

每个邮件服务器都由 SMTP 服务器和 POP3 服务器构成,其中 SMTP 服务器负责发邮件的请求,而 POP3 负责收邮件的请求。通过 SMTP 与 POP3 即可实现邮件的收发。

邮件发送原理图

  • 配置邮件服务器

以网易 163 邮件为例,在发送方邮箱设置里,开启 POP3/SMTP 服务

  • 以 Java 代码为例,发送邮件的 demo
import org.junit.Test;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Properties;public class SendMailDemo {public static void main(String[] args) throws Exception {Properties prop = new Properties();prop.setProperty("mail.host","smtp.163.com");//设置发送方邮箱服务器prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议prop.setProperty("mail.smtp.auth","true");//需要验证用户名密码Session session = Session.getDefaultInstance(prop);Transport ts = session.getTransport();String mailUser = "xxx@163.com"; //邮箱的账号String mailPasswd = "123456789"; //邮箱的密码ts.connect("smtp.163.com", mailUser, mailPasswd);MimeMessage message = new MimeMessage(session);message.setFrom(new InternetAddress(mailUser));//收件人的邮箱地址message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxxx@163.com"));//邮件的标题message.setSubject("自定义通知");message.setContent("<h1 style='color:black'>邮件通知发送成功!</h1>","text/html;charset=UTF-8");ts.sendMessage(message,message.getAllRecipients());ts.close();}
}
  • 运行一次,可以收到邮件

WebHook

钉钉、企业微信、飞书,支持通过 webhook 方式发送通知到群里。下面以钉钉 webhook 为例

  • 首先在钉钉群里,创建一个机器人

群设置->智能群助手

添加机器人->自定义 webhook 接入


  • 直接通过 http 调用 webhook 链接即可,以 Java 代码为例,demo 如下:
public class WebhookDemo {public static void main(String[] args) throws Exception {CloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpPost httpPost = new HttpPost("https://oapi.dingtalk.com/robot/send?access_token=fcf4c30596a8b26d76a6d4dcd658b708066e23e877b285c784db2360660c97e0");httpPost.setHeader("Content-Type", "application/json;charset=utf8");JSONObject result = new JSONObject();JSONObject text = new JSONObject();text.put("content", "测试钉钉发送定时任务通知");result.put("text", text);result.put("msgtype", "text");String jsonString = JSON.toJSONString(result);StringEntity entity = new StringEntity(jsonString, "UTF-8");httpPost.setEntity(entity);CloseableHttpResponse response = null;response = httpClient.execute(httpPost);HttpEntity responseEntity = response.getEntity();System.out.println("响应结果:" + EntityUtils.toString(responseEntity));}
}
  • 运行一次,可以在钉钉群里看到通知消息

开源任务调度系统的通知解决方案

ElasticJob通知解决方案

ElasticJob 是一款基于 Quartz 开发,依赖 Zookeeper 作为注册中心、轻量级、无中心化的分布式任务调度框架,目前已经通过 Apache 开源,使用 ElasticJob 可以快速实现分布式任务调度。ElasticJob 只需配置定时任务的错误处理策略即可实现通知功能。目前 ElasticJob 支持邮件、钉钉、微信三种通知渠道。

  • 接入步骤

以钉钉通知为例

  1. 引入 pom
<!-- elastic job -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.2.0.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.0.RELEASE</version>
</dependency>
<dependency><groupId>org.apache.shardingsphere.elasticjob</groupId><artifactId>elasticjob-lite-spring-boot-starter</artifactId><version>3.0.0-RC1</version>
</dependency>
<dependency><groupId>org.apache.shardingsphere.elasticjob</groupId><artifactId>elasticjob-error-handler-dingtalk</artifactId><version>3.0.0-RC1</version>
</dependency>
  1. 新增 Job
@Component
public class ErrorNoticeDingtalkJob implements SimpleJob {@Overridepublic void execute(final ShardingContext shardingContext) {throw new RuntimeException(String.format("An exception has occurred in Job, The parameter is %s", shardingContext.getShardingParameter()));}
}
  1. 对定时任务进行配置
jobs:errorNoticeDingtalkJob:elasticJobClass: com.springboottemplate.elasticjob.job.ErrorNoticeDingtalkJoboverwrite: trueshardingTotalCount: 3shardingItemParameters: 0=Beijing,1=Shanghai,2=GuangzhoujobErrorHandlerType: DINGTALKjobBootstrapBeanName: errorNoticeDingtalkBeanprops:dingtalk:webhook: you_webhookkeyword: you_keywordsecret: you_secretconnectTimeout: 3000readTimeout: 5000
  • 通知功能缺点

ElasticJob 没有提供控制台来配置定时任务的通知,需要在配置文件里针对每个任务单独配置,配置成本比较高。而且想要修改定时任务的通知配置,还需要修改配置重启服务才能生效,可维护性低。

XXL-JOB 通知解决方案

XXL-JOB,这是出自大众的开源项目,官网上介绍这是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展,与 SpringBoot 有非常好的集成,而且监控界面就集成在调度中心,界面又简洁,对于企业维护起来成本不高,默认支持失败的邮件告警。这就使很多企业选择 XXL-JOB 做调度平台。

  • 接入步骤

XXL-JOB 默认支持失败的邮件告警,只需要在控制台配置对应邮箱即可。

邮件通知也进行了排版:

  • 其他通知渠道

XXL-JOB 可以扩展短信、钉钉等方式,但是需要开发者自己手动实现。如果需要新增一种告警方式,需要新增一个通知类实现 “com.xxl.job.admin.core.alarm.JobAlarm” 接口即可

  • 对比 ElasticJob

XXL-JOB 可以通过控制台来配置每个任务的通知配置,动态生效,接入成本低,可维护性高,比 ElasticJob 方便很多。但是当前版本控制台只支持邮件通知,邮件通知响应速度比较慢,不适合用在核心在线业务的失败通知。

SchedulerX 企业级通知解决方案

SchedulerX 简介

阿里云任务调度 SchedulerX 是阿里巴巴自研的基于 Akka 架构的一站式任务调度平台,兼容开源 XXL-JOB、ElasticJob、Quartz(规划中),提供了商业级的通知管理服务。

通知功能的优势

相对于 ElasticJob、XXL-JOB 等分布式任务调度框架的通知功能相比,SchedulerX 通知功能具有以下几大优势:

  • 多元化的通知通道

当前支持短信、电话、邮箱、webhook(钉钉、企业微信、飞书)。

  • 丰富的通知类型

    • 任务执行失败通知
    • 任务执行超时通知
    • 无可用机器通知
    • 机器繁忙通知
    • 任务执行结果通知
  • 快速响应

通知内容更全面、更智能的通知管理能力,使通知的响应变得更迅速,提高问题解决的速度,减少因业务异常造成的损失。以失败通知为例,通知内容不仅记录了任务的基本信息,还记录了失败原因,方便运维人员快速定位问题。



  • 强大的通知查询功能

SchedulerX 支持查询 15 天内通知历史记录,根据应用、任务、通知类型、通知渠道等多个条件查询的通知信息,能为任务的日常的维护提供参考与指导作用。

  • 支持多种通知对象

SchedulerX 通知管理目前支持通知联系人与通知联系人组两种通知对象。SchedulerX 对通知联系人进行统一管理,用户可以根据自身需要灵活的配置任务的通知对象,减少了通知对象配置的复杂度。

  • 配置简单、学习成本低

SchedulerX 无需用户新增任何代码,在控制台上即可完成所有的报警通知配置,上手速度快、难度低、学习成本几乎为零。

  • 低成本与免运维

SchedulerX 通知管理功能不收取任何费用。其更智能、更全面的通知管理能力可以有效降低系统的运维成本和运维人员的时间成本。

通知功能核心流程

定时任务在某种状态下会触发通知,通过接入层的统一 Api 将通知信息发送给 SchedulerX 的通知管理平台。通知管理平台对通知进行接收、保存。再基于任务的通知配置规则以邮件、短信、语音等方式将定时任务通知推送给用户。

配置联系人组

目前 SchedulerX 的定时任务默认使用的是应用的通知渠道与联系人。想要配置任务的通知渠道与联系人只需要配置对应应用的通知渠道以及通知联系人即可。

  • 新增联系人

登录 SchedulerX 控制台>通知管理>通知联系人。在联系人页签,单击新建联系人,填写联系人相关信息即可。

  • 新增联系人组

登录 SchedulerX 控制台>通知管理>通知联系人。在联系人组页签,单击新建联系组,填写组名称,绑定联系人即可。

  • 应用绑定联系人组

登录 SchedulerX 控制台>应用管理。找到对应的应用,在通知配置中绑定对应的通知联系人组即可。

配置通知类型

登录 SchedulerX 控制台>任务管理。新增或者编辑任务时候,在通知配置中选择对应的通知类型即可。

通知记录查询

SchedulerX 支持查询 15 天内通知记录,根据记录的任务报警信息与通知信息,开发者可以了解到任务一段时间内的健康状态,能为任务的日常的维护提供参考与指导作用。

与开源方案的对比

定时任务报警通知解决方案详解相关推荐

  1. Zabbix+MatrixDB大规模监控与分析解决方案详解(含PPT)

    首先,谢谢原作者:(此文为转载的文章,现将原地址贴出如下:以下文章来源于yMatrix,作者MatrixDB团队Zabbix+MatrixDB大规模监控与分析解决方案详解(含PPT)) 更多精彩Zab ...

  2. 定时任务框架APScheduler学习详解

    定时任务框架APScheduler学习详解 APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时检测钓鱼网站 ...

  3. 11.定时任务定时线程池详解

    3.1 新增定时任务池 11.定时任务&定时线程池详解 ​ 当我们不用任务框架时,我们想自己写一个定时任务时,我们能想起那个工具类呢?Timer ?还有吗?不知道了,下面我们要讲下Schedu ...

  4. 数据脱敏和加密_Apache ShardingSphere数据脱敏全解决方案详解

    解决方案详解 在了解了ShardingSphere脱敏处理流程后,即可将脱敏配置.脱敏处理流程与实际场景进行结合.所有的设计开发都是为了解决业务场景遇到的痛点.那么面对之前提到的业务场景需求,又应该如 ...

  5. 【入门】广电行业DNS、DHCP解决方案详解(三)——DNS部署架构及案例

    [入门]广电行业DNS.DHCP解决方案详解(三)--DNS部署架构及案例 DNS系统部署架构 宽带业务DNS架构 互动业务DNS架构 案例介绍 案例一 案例二 本篇我们将先介绍DNS系统部署架构体系 ...

  6. 加载、滑动翻阅大量图片解决方案详解

    加载.滑动翻阅大量图片解决方案详解 今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制. 我要详细说一下,在缩略图界面点击任意小缩略图后,进入高清大图全屏 ...

  7. iOS开发——加载、滑动翻阅大量图片解决方案详解

    目录(?)[-] 常规思路流程 使用低分辨率图 多线程任务 优化快速翻阅体验 最后还一个砍儿 加载.滑动翻阅大量图片解决方案详解 今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的 ...

  8. iOS开发——加载、滑动翻阅大量图片解决方案详解 .

    加载.滑动翻阅大量图片解决方案详解 今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制. 我要详细说一下,在缩略图界面点击任意小缩略图后,进入高清大图全屏 ...

  9. iOS--加载、滑动翻阅大量图片解决方案详解

    加载.滑动翻阅大量图片解决方案详解 今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制. 我要详细说一下,在缩略图界面点击任意小缩略图后,进入高清大图全屏 ...

最新文章

  1. Vue 生命周期记录_学习笔记
  2. 浅谈精品游戏的研发与发行-蓝港廖明香
  3. HDU-1789-Doing Homework again
  4. python同时同步发送多个请求_python如何实现“发送一个请求,等待多个响应”的同步?...
  5. react native 生成APK
  6. 前端开发 css样式的简写
  7. jms 教程_JMS教程–什么是JMS
  8. 如何用Github删除repository
  9. 985大学计算机专业保研率排名,2016中国大学保研率排行榜出炉
  10. 描述 J2EE 框架的多层结构,并简要说明各层的作用。
  11. 海信电视开启开发者模式
  12. java 定义泛型方法_Java泛型类与泛型方法的定义详解
  13. 用html写的意见调查表代码
  14. 谈谈层次分析法和熵权法以及Topsis
  15. 【无线电】摩尔斯电码的快速记忆法
  16. 密钥mysql_MySQL加密和密钥管理
  17. DHCP动态获取IP地址流程
  18. webpack打包提示: The following entrypoint(s) combined asset size exceeds the recommended limit
  19. 网络接口层协议:ATM
  20. mac多开屏幕_mac如何分屏

热门文章

  1. 排除kafka中的log4j
  2. 和x86同时代的计算机语言指令集,x86指令集同频性能提升
  3. 加工并存储数据的数据结构(上)
  4. 用微信表情翻译表白,程序员的小浪漫,赶紧Get起来!
  5. iOS上架iOS上架规范规范
  6. java 获取周末,JAVA获取一年中所有的周末
  7. ORACLE 获取某一年中的所有周末日期
  8. ESP8266+MicroPython开发:ESP8266使用硬件SPI驱动TFT屏幕(ST7735)
  9. unity串口 连接多个串口崩溃_7个经典问答!10分钟带你了解串口服务器(RS232,RS485,RS422)...
  10. Spring 的扩展机制测试