#V2EX ### [问与答] 如何平衡程序员的代码执行规范严谨性和工作自由度? 如下是一次线上 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); ``` } 风险点: 无法区分认证、连接、超时等问题,定位困难,缺乏可观测性。 https://www.v2ex.com/t/1192593#reply2