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

一、什么是定时任务

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

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

二、定时任务为什么需要通知

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

定时任务报警通知解决方案详解_第1张图片

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

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

三、自研定时任务报警通知

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

3.1、邮件

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

定时任务报警通知解决方案详解_第2张图片

邮件发送原理图

  1. 配置邮件服务器

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

定时任务报警通知解决方案详解_第3张图片

  1. 以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 = "[email protected]"; //邮箱的账号
        String mailPasswd = "123456789"; //邮箱的密码
        ts.connect("smtp.163.com", mailUser, mailPasswd);
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(mailUser));
        //

你可能感兴趣的:(服务器,java,运维,阿里云,云计算)