如下是一次线上 paas 平台内的 java 包邮件发送异常,就是一个典型案例。实际发生问题,程序员言之凿凿自己代码没问题,然后大家一起过代码排查结果,问题如下

如何把研发标准从制定标准落实到代码管理规范中?逐渐形成一种思维模式和惯性,而不是发现问题解决问题,比如:超实,数据获取方式,异步处理,这些参数的使用和定义能否从项目开始就顺手写出更健壮的代码?发家如何看待这些问题?请多指教

问题 1 (致命):SMTP 超时设置为 1 秒

prop.setProperty("mail.smtp.timeout", "1000");

风险点,高峰期频繁出现

SocketTimeoutException: Read timed out ,被误判为数据库或邮件系统问题。

问题 2:未设置连接和写入超时

mail.smtp.connectiontimeout

mail.smtp.writetimeout

风险点:

网络波动时连接长时间阻塞,大附件发送过程中线程被占用,在高并发下容易形成线程堆积

问题 3:同步 HTTP 线程直接发送邮件

javaMailSender.send(mimeMessage); 运行在进程:XNIO-1 task-*

风险点:SMTP 属于慢 IO 操作,高并发多附件容易卡住,高并发情况下可能导致接口响应变慢甚至线程耗尽

问题 4:附件加载方式不稳定

mimeMessageHelper.addAttachment(

attachment.getFileName(),

getInputStreamSourceFromUrl(attachment.getUrl())

);

风险:

网络耗时叠加,超时概率显著增加,整体发送时长不可控

问题 5:异常处理过于笼统,未做错误判断处理

catch (Exception e) {

log.error("邮件发送失败,错误信息:", e);

}

风险点:

无法区分认证、连接、超时等问题,定位困难,缺乏可观测性。

标签: none

添加新评论