从今天起开一个固定栏目:每天读一本书,把里面的东西压缩到 20 分钟内读完,再写点自己的看法。方向是金融、AI、历史这三块——前两块是饭碗,最后一块是让人不至于把今年发生的事都看成世界末日。 这个栏目不打算做成读书笔记的搬运。我做了八年 Java 和 AI,又自己跑过出海盘子、也清零过两次,读这些书
一次误删 ConfigMap,让我重新想发布这件事 年初我们还是"人肉发布":本地打镜像、kubectl set image、改几个 ConfigMap。有次同事手滑把生产环境的 ConfigMap 改错了一个 value,Pod 起来就读不到正确配置,故障持续了 12 分钟。事后复盘,我意识到问题
读源码时的一句注释,让我重新审视响应式 前阵子读 Spring Data R2DBC 的源码,看到 R2dbcEntityTemplate 里一句话:"JDBC blocks the calling thread; R2DBC does not." 我当时手头正有个网关服务,Tomcat 的线程池经
起因:架构评审会上的一个提议 七月底的架构评审,有人提议"我们新服务要不要上 JPMS 模块化"。理由是能强封装、能裁剪 JRE 让镜像变小。当时我们正在做 JDK 11 迁移(见上一篇),正好顺手调研了一下。 我花了三天做了个 POC,结论是:服务端业务系统别上,工具类库可以考虑。过程和理由记一下
压测时 CPU 打满,top 却看不出热点 上个月我们对订单导出服务做容量评估,用 JMeter 打 800 并发。奇怪的是:应用进程 CPU 占用 760%(8 核几乎跑满),但业务代码里我自认为的"重计算"那段——一个金额汇总循环——在抽样栈里占比不到 8%。同事在群里问:"你那个汇总到底慢在哪
RSS 涨到 5.8 GB,但堆才用了 1.2 GB,也没 OOM 4 月底值班,监控告警:订单服务一个实例的容器内存(RSS)从 2 GB 缓慢涨到 5.8 GB,持续了四天还在涨,但没有抛 OutOfMemoryError。K8s 的内存 limit 是 6 GB,再涨就要被 OOMKilled
滚动发布时,监控里出现了 0.3% 的 5xx 毛刺 4 月一次常规滚动更新,发布过程中 Grafana 的 5xx 曲线冒出一排小毛刺,单个实例发布期间大约丢了 0.3% 的请求。量不大,但每次发布都有,说明是上下线姿势不对,不是偶发。 我们的 Java 服务跑在 K8s 上,Spring Boo
一次发布把下单接口打挂了,CI 里却全是绿的 4 月一次常规发布后,下单接口 5xx 飙到 12%。回看 CI 流水线,单元测试全绿。问题出在:单元测试只覆盖了方法内部逻辑,没人验证"接口契约"本身——前端传的字段名改了,后端字段名也跟着改,但两边没对齐,网关层反序列化直接失败。 这事之后我把接口自
升级 Redis 7.0 时,我把一段 Lua 脚本换成了 Functions 4 月 Redis 7.0 正式发布,我们把集群从 6.2 升到 7.0。升级本身平滑(RDB/AOF 兼容),但翻 release notes 时发现一个我一直想要的东西:Redis Functions。我们原本用 L
一次资损:限领 1 张的券,用户领了 2 张 1 月初的一个上午,运营在群里 @ 我:一张"新客专享 50 元券",配置的是每人限领 1 张,有用户领到了 2 张,已经核销了一张。 我查了数据库: mysql> SELECT user_id, coupon_id, count(*) c FROM c
大促压测:Redis 被打到 12 万 QPS,还是扛不住 3 月大促前做全链路压测,商品详情页的接口目标 5 万 QPS。单 Redis 集群(3 主 3 从,Redis 6.2)在 12 万 QPS 时 CPU 跑满,P99 从 3 ms 飙到 47 ms,再往上就开始超时。加节点成本太高,而且
重构支付模块时,我把 600 行 if-else 拆成了四个模式 上个月接手支付模块重构。打开 PaymentService.pay() 那一刻我有点懵:一个方法 600 多行,开头十几个 if (channel == WECHAT) ... else if (channel == ALIPAY)
半年内第四次,又是新 SQL 没索引 2021 年 5 月 10 号,一个上线不到两小时的功能把数据库打挂了。原因是一段新写的查询没走索引,全表扫 4000 万行。 难受的是,这不是第一次。我翻了下过去半年的故障记录: 日期 原因 影响时长 2020-12-08 新接口 SQL 未加索引 47 分钟
对账群里跳出一条消息:同一笔订单扣了两次款 2 月 19 号下午,财务在对账时发现一笔订单出现了两次支付成功记录,金额都是 199 元。看起来是消费者把消息重复处理了。 我们用的 Kafka 是 3.1.0,消费者是 enable.auto.commit=true 默认配置。同事问我:不是说 Kaf
架构评审会上,两个人对着吵了四十分钟 2 月中旬的一次架构评审,议题是"下单链路要不要上 Seata"。后端 A 主张用 AT 模式,理由是几乎不用改业务代码;后端 B 坚持用消息队列做最终一致,理由是"我们承受不了 Seata 挂掉导致下单全挂"。 我最后拍板:全都不用,主链路走本地消息表,退款单
「Arthas 凭什么不用改代码就能看到方法耗时」 2 月初排查一个慢接口,我用 Arthas 的 trace 打出了每一层调用的耗时。旁边一个刚工作两年的同事看完很惊讶:我们没加任何埋点,也没改代码,它怎么知道每个方法花了多久? 这个问题一两句话讲不清楚,正好我那几天在给公司内部的压测平台做一个无