从今天起开一个固定栏目:每天读一本书,把里面的东西压缩到 20 分钟内读完,再写点自己的看法。方向是金融、AI、历史这三块——前两块是饭碗,最后一块是让人不至于把今年发生的事都看成世界末日。 第一本很适合开栏:《金钱心理学》(The Psychology of Money),摩根·豪泽尔。 它的核心
凌晨两点的告警:消息积压 12 万条 6 月 18 号大促那晚,我睡到两点被电话叫醒。监控群里刷的是一条 RocketMQ 的告警:order_pay_topic 消费 TPS 从平时的 800 掉到了 30,积压量 12 万条还在涨。 赶紧登机器看日志,消费者进程活着,CPU 只有 11%,但日志
review 的时候,我看到一段"用 Optional 写的判空" 5 月底做代码评审,看到同事写了这么一段: Optional<User> userOpt = userMapper.findById(userId); if (userOpt.isPresent()) { User user
短信服务商挂了 23 分钟,我们丢了 1247 单 那是去年 11 月的事。我们合作的短信服务商机房故障,接口全部超时。按理说短信发不出去不是什么大事,但那天下单成功率从 99.9% 掉到了 63%,23 分钟里少成交了 1247 单。 原因很简单:下单接口里同步调用了发短信,短信服务超时 30 秒
凌晨两点的死锁告警 5 月 28 号凌晨,库存服务的告警响了:批量扣减任务报死锁,一晚上 217 次。错误是客户端收到的: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when t
jstack 里那个等了 40 秒的线程 5 月中旬,运营反馈大客户导出特别慢,一个 20 万行的订单导出要跑三分钟。我抓了几份 jstack,发现有个线程的行为很奇怪: "export-thread-7" #48 prio=5 os_prio=0 tid=0x00007f8c4c0d8000 ni
方案评审上,我们为一个超时场景吵了一小时 5 月初做支付回调的改造,评审会上卡在一个问题上:调用支付网关的查询接口超时了,这笔订单该标记为成功、失败,还是"处理中"? 一派说标记为失败,让用户重新支付;另一派说标记成成功,反正钱已经扣了;还有人说先挂着,等定时任务去查。三种意见都有道理,谁也说服不了
加一个"送新人券"的需求,我改了注册方法 4 月底产品提了个小需求:新用户注册成功后自动发一张 20 元的无门槛券。我打开 UserService.register(),120 行,里面已经塞了校验、插库、发欢迎短信、埋点上报、初始化用户配置五件事。 我在第 87 行插了三行调用发券的代码。提 PR
宿主机重启,Redis 丢了 5 分钟的数据 4 月 20 号凌晨,云厂商的一台宿主机异常重启,我们的 Redis 主节点正好在上面。进程恢复之后,运营来反馈:03:12 到 03:17 之间领取的优惠券,用户端显示"未领取",但业务库里记录是有的。 核对下来丢了 2347 条。我们 Redis 5
同事说"Lambda 就是匿名内部类的语法糖" 三月底做代码评审,我提了个建议说"这里可以用 Lambda 简化"。同事回了句:"Lambda 不就是匿名内部类的语法糖吗,性能还差一点,没必要改。" 我说不上来哪里不对,但记得在哪看过说 JDK 8 的 Lambda 底层用的是 invokedyna
测试提了个 bug:数据没回滚 3 月初做批量导入功能,测试提了个单:导入 1000 条订单,第 500 条数据有误抛了异常,预期全部回滚,结果前 499 条都写进库了。 我第一反应是不可能,@Transactional 明明标着。看代码: @Service public class OrderIm
凌晨三点的告警:Metaspace OOM 3 月 15 号凌晨 3 点 12 分,监控告警把值班同学叫起来了:报表服务的一台实例 Full GC 频繁,接口全部超时。我早上到公司看日志,第一行就是: java.lang.OutOfMemoryError: Metaspace at java
统计三月的订单,查出来是四月的 3 月中旬接了个老项目的改造任务,其中一块是给运营加个按月导出订单的功能。我写了个 SQL 拼时间的工具类,自测的时候点了三月,导出来的数据全是四月的。 当时那段代码: public static Date monthStart(int year, int month
DBA 丢给我一张容量曲线图 2 月底,DBA 在周会上放了张图:订单主库 t_order 已经 4200 万行,数据文件 38G,加上索引一共 51G,按每月 380 万行的增速,年底到 8000 万行,明年年中破亿。他的结论是"该考虑分库分表了"。 主管把这个评估任务派给了我。说实话我当时有点虚
同事的循环依赖启动报错,我的没报错 2 月底做权限模块重构,同事写的代码一启动就挂: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'roleServ