邮件通知,引发的线上S级故障

我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言

好的架构设计,报警通知必不可少。但是报警用不好,也会造成线上的S级故障。故障的等级各公司的定义标准不一样,总之S级故障在我们公司就是最高级别的故障,需要放下手头所有的事情,全力解决问题。这类故障类似的阿里的P0级故障。

本文将以邮件报警通知为例,因为邮件通知不花钱,哈哈哈...

02 SpringBoot集成邮件

之前领导特别注重报警机制,领导的意思就是,我们一定要早于业务或者用户收到异常的报警,然后紧急处理,让业务或用户无感使用。于是我在业务项目中,引入了短信报警,但由于短信花钱,后来又改成了邮件报警了。

2.1 邮件的Maven依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2.2 邮件的配置

这里的配置以网易邮箱为例。官网的端口如图:

properties 复制代码
spring.mail.host=smtp.163.com
spring.mail.username=your-email@163.com
# 这里不是密码,配置的授权码
spring.mail.password=your-password
# ssl配置
spring.mail.port=465
spring.mail.properties.mail.smtp.socketFactory.class = javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.auth = true
spring.mail.properties.mail.smtp.starttls.enable = true
spring.mail.properties.mail.smtp.starttls.required = true

以网易邮箱为例,授权码获取方式:

2.3 项目实战

java 复制代码
@Autowired
private JavaMailSender javaMailSender;

@Test
void mailTest() {
    SimpleMailMessage msg = new SimpleMailMessage();
    // 发送人
    msg.setFrom("send@163.com");
    // 接收人
    msg.setTo("target@autostreets.com");
    // 邮件主题
    msg.setSubject("【异常报警】");
    // 邮件内容
    msg.setText("测试:系统异常了,赶快去处理吧");
    javaMailSender.send(msg);
}

测试结果:

03 故障发生

3.1 起因

故障的发生往往是不经意间,因为要监控系统是否正常,所以特意引入了健康检查。它会自动检查是部分服务是否异常,如果有异常就会报警。依赖如下:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

健康检查内置了自动检查的服务。其中一项有包括了我们今天讲的邮件服务,然后故障发生前,我们对健康检查的对象并没有清楚的了解,只知道要监控异常。自然监控的越多越好。

这也为后续故障埋下了定时炸弹。

3.2 故障产生

因为线上真正使用的是CoreMail服务商的邮箱,一直都没有问题。突然有一天CoreMail服务商的服务器宕机了,他们也没有通知我们。

首先我们运维团队收到CPU飙升的报警,经过日志查询发现,系统在不停地连接邮箱服务器。联系了CoreMail服务商之后,确认是他们服务宕机了。在等待CoreMail恢复的过程中,我们的服务器因为不停地重试,导致我们自己的服务也宕机了。这个生产事故妥妥的S级故障。

在复盘的时候发现,就是因为健康检查发现邮箱服务异常,触发重试机制导致的。

3.3 问题解决

问题解决也很简单,关闭邮件的健康检查即可。官网文档也给出了说明。

properties 复制代码
# 关闭邮箱的健康检查
management.health.mail.enabled=false

当然也可以通过更换集成Mail的方式来解决。上面的方式是Springboot配置的方式,我们可以采用工具类的方式,框架也就检查不到了。

java 复制代码
@Test
void testMail() {
    JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
    javaMailSender.setProtocol("smtp");  // 协议
    javaMailSender.setHost("smtp.163.com"); // SMTP服务器地址
    javaMailSender.setPort(465); // SMTP服务器端口
    javaMailSender.setUsername("wsapplyjob@163.com"); // 发件人邮箱地址
    javaMailSender.setPassword("TKj2Vg83tbiEZEmw"); // 发件人邮箱密码
    javaMailSender.setDefaultEncoding("UTF-8"); // 设置默认字符编码

    Properties props = new Properties();
    // 开启SSL加密配置
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.starttls.required", "true");


    javaMailSender.setJavaMailProperties(props);

    SimpleMailMessage msg = new SimpleMailMessage();
    msg.setFrom("wsapplyjob@163.com");
    msg.setTo("shuai.wang@autostreets.com");
    msg.setSubject("【异常报警】");
    msg.setText("测试:系统异常了,赶快去处理吧");
    javaMailSender.send(msg);
}

04 小结

在职场中,我们经常会踩这样那样的坑。踩坑我们不要怕,积累起来就是自己的经验。正因为踩的坑比较多,当别人遇到问题咨询时,你会发现,基本都是自己踩过的坑,自然而然就变成了大家眼里的有经验的人了。

重要的是,踩过的坑要积累填坑的经验,光踩坑了,不填坑,那么为了避坑,路只会越走越窄,各行各业亦是如此。

相关推荐
黎雁·泠崖3 小时前
【魔法森林冒险】2/14 抽象层设计:Figure/Person类(所有角色的基石)
java·开发语言
Java编程爱好者3 小时前
Seata实现分布式事务:大白话全剖析(核心讲透AT模式)
后端
神奇小汤圆3 小时前
比MySQL快800倍的数据库:ClickHouse的性能秘密
后端
小小张说故事4 小时前
BeautifulSoup:Python网页解析的优雅利器
后端·爬虫·python
怒放吧德德4 小时前
后端 Mock 实战:Spring Boot 3 实现入站 & 出站接口模拟
java·后端·设计
biyezuopinvip4 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
UrbanJazzerati4 小时前
Python编程基础:类(class)和构造函数
后端·面试
脸大是真的好~4 小时前
EasyExcel的使用
java·excel
小宋10214 小时前
Java 项目结构 vs Python 项目结构:如何快速搭一个可跑项目
java·开发语言·python
Tadas-Gao4 小时前
缸中之脑:大模型架构的智能幻象与演进困局
人工智能·深度学习·机器学习·架构·大模型·llm