从今天起开一个固定栏目:每天读一本书,把里面的东西压缩到 20 分钟内读完,再写点自己的看法。方向是金融、AI、历史这三块——前两块是饭碗,最后一块是让人不至于把今年发生的事都看成世界末日。 第一本很适合开栏:《金钱心理学》(The Psychology of Money),摩根·豪泽尔。 它的核心
一次库存超发,我们把手写的 setnx 锁全换成了 Redisson 3 月底的一次促销活动,某款商品库存 200 件,实际卖出 213 件。超发 13 件。客服赔了 13 张 50 元券,加上运营的抱怨,够我记很久。 查下来是分布式锁失效。我们当时用的是自己封装的 setnx 锁,问题出在一个很隐
压测时 Hystrix 的线程切换吃掉 1.4 毫秒,我们换成了 Sentinel 3 月做秒杀压测,QPS 压到 3000 的时候就上不去了。抓了一次火焰图,发现热点不在业务代码,在 HystrixThreadPool 的线程调度上。 我们订单服务上挂了 11 个 @HystrixCommand,
标了 @Scope("prototype"),为什么拿到的还是同一个对象 3 月上旬,同事遇到个怪事。他写了个导出 Excel 的任务类,因为里面有状态(当前行号、样式缓存),标成了多例: @Component @Scope("prototype") public class ExcelExport
32 万行单体,我们用了 5 个月切成微服务,一次没停过机 去年 10 月启动的拆分,到今年 2 月底核心链路切完。这期间系统一天没停过,用户侧没有感知到任何一次发布异常。回过头看,技术选型上没什么新鲜的,真正难的是"怎么一步步把流量搬过去,以及搬错了怎么退回来"。 先说被拆的那个东西 shop-a
新人装环境装了两天,我写了份 docker-compose.yml 组里 2 月来了个新同事。第一天拉代码,第二天还在拉代码——不是网速问题,是在装环境:MySQL 8.0、Redis 5.0、RocketMQ 4.6.1、Nacos 1.1.4、Elasticsearch 7.5,一个一个装,中间
一个 780 MB 的镜像,让每次发布多等三分钟 我们去年底把服务容器化了,当时赶时间,Dockerfile 写得非常粗糙: FROM openjdk:8-jdk WORKDIR /app COPY target/order-service.jar app.jar EXPOSE 8080 ENTRY
1.2 亿条订单导入 ES,按当时的速度要跑 66 小时 二月初接了个活:把 MySQL 里 2017 年之后的历史订单同步到 Elasticsearch,给客服系统做多条件检索。总共 1.24 亿条。 我先用原来的同步代码跑了半小时,用 _cat/indices 数了一下文档数增长:单机 470
群里有人问:ReadTimeout 配了 5 秒,为什么 1 秒就超时 那天下午,新来的同事在企业微信群里贴了一段配置和一段报错: ribbon: ConnectTimeout: 3000 ReadTimeout: 5000 com.netflix.hystrix.exception.Hy
每次发版都有几十个 502,终于找到原因了 我们服务是 2019 年 11 月上的 Kubernetes,1.16 版本,Deployment 配 4 个副本。从上线那天起,每次滚动发布,网关那边都会报几十个 502,持续时间一两秒。因为量不大、用户基本无感,一直没排。 直到 1 月初做活动,晚上八
财务对账少了 38 笔,消息不知道去哪了 1 月 10 号早上,财务那边甩过来一张表:12 月的积分发放记录比订单表少了 38 笔。我们发积分是下单成功后发一条 ORDER_PAID_TOPIC,积分服务消费它加积分。订单在,积分没加,说明消息在中途没了。 38 笔,占当月 47 万订单的万分之零点
交接过来的 Jenkins 里躺着两个 Freestyle 任务 12 月中旬,运维同事离职,他把公司那台 Jenkins 丢给了我。机器上跑的是 Jenkins 2.190.3,装在一台 4 核 8G 的 CentOS 7 虚拟机上,加起来只有两个 Freestyle 任务:一个构建后端 jar,
面试官追问"ABA 具体怎么解决",我卡住了 12 月中的一次面试。聊到 CAS,我说"它有个 ABA 问题",面试官问"什么场景下真的会遇到 ABA?怎么解决?" 我答"加版本号",他又追了一句"JDK 里加版本号的那个类,你知道它的 compareAndSet 是怎么实现的吗?" 答不上来。回去
那个 CPU 100% 的现场,和我熬夜复现的死循环 12 月初,隔壁组的老服务(跑在 JDK 7 上的一套结算系统,JDK 一直没升)CPU 突然跑满。监控上 CPU 从 30% 直接顶到 100%,而且是持续的,降不下来。接口全部超时,重启之后几分钟又上去。 我过去帮忙看,抓了现场。这篇记录整个
运维问我们:服务器上装的 JDK 要不要交钱 11 月底,运维在群里发了张截图,是某篇公众号文章的标题:"Oracle JDK 开始收费,你们公司准备好被起诉了吗"。他问我们的服务器要不要处理。 我把许可协议翻了一遍,发现事情没那么吓人,但确实得做个决定。这篇是整理出来的结论。 到底改了什么 201
面试官问"你们生产用哪个收集器",我答不上来 11 月中旬的一次面试,面试官问:"你们生产 JVM 用的什么垃圾收集器?为什么选它?" 我当时的回答是"默认的,没配过"。面试官点了点头没追问,但我知道这题挂了。回去之后把 GC 这块从头看了一遍,顺便把我们线上的 GC 日志翻出来分析了下,发现确实该