定时任务报警通知解决方案详解
作者: 唐涛、黄晓萌
什么是守时使命
守时使命是每个事务常见的需求,比方每分钟扫描超时支付的订单,每小时整理一次数据库历史数据,每天计算前一天的数据并生成报表等等。
随着微服务和云计算的兴起,守时使命技能也是发展敏捷,不只能做单机的守时使命,并且在分布式体系下运用也很广泛,成为了事务做兜底、数据处理的榜首挑选。
守时使命为什么需求告诉
守时使命现在在事务数据处理中的比重越来越重,假如事务数据处理失利了,需求及时告诉到事务方,确保了服务的可靠性和稳定性。一起,好的守时使命告诉体系,还能分析使命失利的原因(比方仓库信息)并告诉给事务方,帮助用户快速定位问题。
依据告诉的类型,大约能够有以下几类:
- 成功告诉:使命履行成功,把成果告诉给用户。比方计算前一天的数据并把 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>邮件告诉发送成功!</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 支撑邮件、钉钉、微信三种告诉途径。
- 接入过程
以钉钉告诉为例
- 引入 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>
- 新增 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()));
}
}
- 对守时使命进行装备
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 默认支撑失利的邮件告警,只需求在操控台装备对应邮箱即可。
邮件告诉也进行了排版:
- 其他告诉途径
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 天内告诉记载,依据记载的使命报警信息与告诉信息,开发者能够了解到使命一段时刻内的健康状况,能为使命的日常的保护供给参阅与指导作用。