共计 6065 个字符,预计需要花费 16 分钟才能阅读完成。
作者: 唐涛、黄晓萌
什么是定时工作
定时工作是每个业务常见的需要,比方每分钟扫描超时领取的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表等等。
随着微服务和云计算的衰亡,定时工作技术也是倒退迅速,不仅能做单机的定时工作,而且在分布式系统下利用也很宽泛,成为了业务做兜底、数据处理的第一抉择。
定时工作为什么须要告诉
定时工作当初在业务数据处理中的比重越来越重,如果业务数据处理失败了,须要及时告诉到业务方,确保了服务的可靠性和稳定性。同时,好的定时工作告诉零碎,还能剖析工作失败的起因(比方堆栈信息)并告诉给业务方,帮忙用户疾速定位问题。
依据告诉的类型,大略能够有以下几类:
- 胜利告诉:工作执行胜利,把后果告诉给用户。比方统计前一天的数据并把 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 反对邮件、钉钉、微信三种告诉渠道。
- 接入步骤
以钉钉告诉为例
- 引入 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 天内告诉记录,依据记录的工作报警信息与告诉信息,开发者能够理解到工作一段时间内的衰弱状态,能为工作的日常的保护提供参考与指导作用。
与开源计划的比照