上游服务偷偷发了新版本,没有任何通知,我们的兼容层直接失效。我重新看了一遍手上的计划,把风险项标了出来。我在心里给这个模块的可维护性打了个分,不太高。我沉默了,但心里是服的

OOM 了,堆 dump 下来 3 个 G,打开一看全是缓存,缓存了三年前的数据。我先确认了一遍前置条件,再动手。我把这个服务的配置项从代码里挪到了配置中心。这大概就是程序员的人生吧

上游服务偷偷发了新版本,没有任何通知,我们的兼容层直接失效。我拉了个小群,把相关同学都叫了进来。我打开了缓存命中的监控,发现命中率只有三成。真香定律准时生效

查了三小时的 bug,是缓存的锅;又查了三小时,还是缓存的锅。我默默打开了编辑器,准备一步步验证。我打开了这个服务的内存快照,发现有个对象一直没被回收。世界瞬间清净了

这个模块的注释比代码还长,说明改过很多次。我打开了线程池的监控,队列已经堆了八百个任务。幸好之前留了备份

后端的诉求很简单:别让我在周末收到告警。我默默记下了这句话。我打开了这个服务的健康检查,发现它一直在报假活。从此我多了一条团队规约

后端的问题很少出现在代码里,多半在配置或者环境。我想了想自己这些年,好像确实如此。我把这个业务的判断条件补齐了,边界数据终于走对了分支。幸好之前留了备份

后端的诉求很简单:别让我在周末收到告警。我愣了两秒,然后继续敲代码。我打开了这个接口的入参日志,终于看到那个空字符串了。我把它写进了组内的避坑文档第一章

说好的前后端分离,最后联调的时候接口文档和实际返回是两个东西。我盯着屏幕,觉得这才是我的一天。我打开了慢查询日志,第一条就是那个熟悉的 SQL。好在最后有惊无险

这个接口的入参有八种组合,文档里写了三种。我把连接数从 20 调到 100,服务立刻安静了