定时任务报警通知解决方案详解

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
函数计算FC,每月15万CU 3个月
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: 随着微服务和云计算的兴起,定时任务技术也是发展迅速,不仅能做单机的定时任务,而且在分布式系统下应用也很广泛,成为了业务做兜底、数据处理的第一选择。

作者: 唐涛、黄晓萌


什么是定时任务


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


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


定时任务为什么需要通知


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


1.jpeg


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


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


自研定时任务报警通知


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


邮件


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


2.jpeg

邮件发送原理图


  • 配置邮件服务器 


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


3.png


  • 以 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();
    }
}


  • 运行一次,可以收到邮件 


4.png


WebHook


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


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


设置->智能群助手


5.png


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


6.png

7.png


  • 直接通过 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));
    }
}

  • 运行一次,可以在钉钉群里看到通知消息


8.png


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


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 {
    @Override
    public 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.ErrorNoticeDingtalkJob
      overwrite: true
      shardingTotalCount: 3
      shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou
      jobErrorHandlerType: DINGTALK
      jobBootstrapBeanName: errorNoticeDingtalkBean
      props:
        dingtalk:
          webhook: you_webhook
          keyword: you_keyword
          secret: you_secret
          connectTimeout: 3000
          readTimeout: 5000


  • 通知功能缺点


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


XXL-JOB 通知解决方案


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


  • 接入步骤
     

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


9.png


邮件通知也进行了排版:


10.png


  • 其他通知渠道
     

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 通知功能具有以下几大优势:


11.jpeg


  • 多元化的通知通道


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


  • 丰富的通知类型


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


  • 快速响应


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


12.png

13.png

14.png


  • 强大的通知查询功能


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


  • 支持多种通知对象


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


  • 配置简单、学习成本低


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


  • 低成本与免运维


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


通知功能核心流程


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


15.jpeg


配置联系人组


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


  • 新增联系人


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


16.png


  • 新增联系人组


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


17.png


  • 应用绑定联系人组


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


18.png


配置通知类型


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

19.png


通知记录查询


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


20.png


与开源方案的对比


21.png

相关文章
|
6月前
|
弹性计算 安全 机器人
一键搞定定时自动化通知
您是否经常忘了需要每周要填报工作时长?您的团队是否需要每月定时盘点HC?您是否每月末都在工作群提醒大家更新OKR? 这些简单的定时任务是不是经常会忘记或者占用您的精力?如果你也有这些烦恼,是时候来试试这个应用与数据集成平台——阿里云计算巢AppFlow了,它能够像一个神经中枢,高效地串联起所有关键数据流,并且能够巧妙地运用现代化的通讯工具如钉钉群机器人,实现定时消息通知,让每一个重要信息都能准时送达,不再因为简单重复的定时工作而占用您的时间和精力~
224 0
|
6月前
|
异构计算
zTasker v1.88.1一键定时自动化任务
zTasker是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具,支持win7-11。其支持超过100种任务类型,50+种定时/条件执行方法,而且任务列表可以随意编辑、排列、移动、更改类型,支持任务执行日志,可覆盖win自带的热键,同时支持任务列表等数据的备份及自动更新等。
115 3
|
6月前
|
弹性计算 运维 监控
动态服务器监控与通知系统
【4月更文挑战第30天】
63 0
|
运维 资源调度 Java
定时任务报警通知解决方案详解
本文详细介绍定时任务通知的解决方案,以及市面上常见的开源定时任务通知方案对比。
996 2
|
监控
限制SLS告警通知时段的几种常见方法
在对系统进行监控告警的过程中,有时候并非在任何时候都要接收告警通知,本文会介绍几种常见的限制告警通知时段的方法,以及它们各自所适用的场景。
418 0
限制SLS告警通知时段的几种常见方法
|
安全 网络安全 开发者
紧急事件的告警通知|学习笔记
快速学习紧急事件的告警通知
143 0
|
缓存 Java Spring
报警系统QuickAlarm之报警执行器的设计与实现
根据前面一篇总纲的博文,将整体结构划分为了四大块,本文则主要目标集中在第一块,报警执行器(AlarmExecute)的设计与加载上了 主要的关注点无外乎 定义-》加载-》实现逻辑三块了: 1.AlarmExecute 的接口定义 2.如何加载用户自定义的AlarmExecute 3.AlarmExecute的内部实现
346 0
报警系统QuickAlarm之报警执行器的设计与实现
|
JSON 编解码 监控
SLS告警重磅更新——让你的告警通知一目了然
SLS告警最近升级了通知的模板语法,在保持对原有模板语法兼容的情况下,增加了动态渲染的功能,不仅支持条件语句、循环语句等控制流,还内置了50+函数,可以非常方便地对数据进行各种处理,从而可以非常灵活方便地对通知内容进行定制,让通知内容呈现的效果更加丰富、内容一目了然。
907 0
SLS告警重磅更新——让你的告警通知一目了然
|
Prometheus 监控 Cloud Native
5分钟理解SLS告警通知时机
SLS告警支持丰富的告警管理功能,例如合并抑制静默等功能,跟SLS旧版告警相比增加了很多告警降噪抑制的功能,和用户管理,值班组和可定制复用的内容模板功能。在使用的过程中,因为增加了告警的降噪功能,从告警产生到发送通知这个过程增加了一个告警降噪的过程;因为降噪机制的存在,可能会出现告警触发但不一定会立即发出通知的情况。了解SLS告警通知时机将有助于理解这些情况。
854 0
5分钟理解SLS告警通知时机
|
调度 Python
定时功能
利用Py简单实现定时功能