如下是一次线上 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);
}
风险点:
无法区分认证、连接、超时等问题,定位困难,缺乏可观测性。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.