ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

技术月结复盘:架构、云成本、性能优化与踩坑实录

技术月结复盘:架构、云成本、性能优化与踩坑实录 做月结栏目我这儿说的可不是写日记是每个月底把当月的动态、架构、云技术、算法、后端、前端、收听/收看、英文、书籍、影视、好歌、新奇全部盘一遍加上定期更新的承诺压缩成一篇能反复回看的东西。这是我这个栏目的第二回合。含泪总结是因为过程真不轻松憋泪分享是因为整理完会发现一个月被压缩成几十个要点后价值密度高得吓人。上一回合结束后我一度想停更原因很朴素要整理的东西太多每个板块都要有东西可写还得让人读得下去。但到了月底把碎片重新翻开那些当时没当回事的记录堆在一起竟然能拼出一张挺清晰的成长地图。所以我决定继续把踩过的坑也一并写出来。1. 为什么叫“第二回合”月结栏目不是日记是一条内容流水线1.1 第一次做的时候我把它当成了“月度作文”第一回合做得很痛苦。我把月结理解成“写一篇大长文”于是前半个月在憋主题后半个月在焦虑最后一天在赶工。写出来之后我自己都不太想回看因为那更像期末总结不像一份能反复使用的资料。第二回合我换了一个基础假设月结不是“创作”而是“盘点加索引”。我要做的不是从零写文章而是把一个月里已经存在的碎片按固定的篮筐分拣好再补上必要的上下文。标题里那个“回合”也是这个意思——这不是一期杂志是跟过去的自己打一场有来有回的复盘赛赢了赚经验输了也赚经验。这么一改整个节奏就不一样了。我不再担心“这个月有没有大事发生”而是开始关心“这个月我有没有留下足够多的原始素材”。为了证明这个思路对我这一期把栏目架构也重做了下面直接列出。1.2 栏目架构是怎么取舍出来的标题里那串标签看着多实际上我归成了三大类。第一类进度与动态类包含“定期更新”和“动态”。这一类的价值是建立承诺感。读者知道你会不会按时出现你自己也被这个承诺推着走。我一开始不愿意设这个板块因为觉得“我又不是新闻媒体”但后来发现公开承诺是维持长期输出效率最好的机制。第二类技术与实践类包含“架构、云技术、算法、后端、前端”。这一类是月结的技术主线。我给自己定的规则是不写纯理论只写本月真实处理过或认真观察过的细节。哪怕只是一个小接口的性能优化只要把原因和过程写清楚它就是有复读价值的。第三类输入与视野类包含“收听/收看、英文、书籍、影视、好歌、新奇”。这一类的定位是反哺下一阶段的输出素材。我特别想强调一件事输入盘点最忌讳写成推荐清单必须在推荐后面附上一句“它让我改变了什么”否则下个月自己看的时候根本想不起当时为什么激动。那为什么没有单独设“生活”板块因为生活写到月结里要么变成流水账要么变成情绪日记很难给读者提供稳定价值。我做的是技术加内容复盘导向的月结把生活细节打散到各个板块里就好不需要单独给它开一桌。1.3 这是一条流水线不是一个文件夹做第二回合之前我把整个流程重新梳理了一遍本质上是一条“素材流水线”日常收集手机备忘录里的零散想法、浏览器书签、代码提交记录、播客收听记录、英文学习打卡全都落到一个统一收件箱。每周预整理每周日晚花十分钟把本周值得写入月结的点挑出来标记好日期和来源。月末冻结更新日前三天停止收新素材之后只做整理与删减。月末发布按板块分拣每个板块挑三到五个关键点写成可读的段落发布。归档索引发布后把当月月结链接、相关素材、待办线索回收到一个archive目录。不要小看这五步。第一回合的失败就在于我只有第4步前面全都没有。素材没有入口月末就只能靠脑子硬扛脑子在月底本来就不好使。这件事对我的实际影响也比想象中大。首先是个人知识资产变得可检索过去一个月做了什么翻月结就行其次是团队讨论时有据可依我跟同事聊方案可以直接引用上个月的观察最后是输出变成一种习惯不再依赖灵感。最大的一笔“影响范围”反而是公开承诺带来的责任感——定了每月最后一个周末更新到了那几天就算没灵感也会坐下来把至少一个板块写完整。2. 技术线盘点架构、云技术、算法、后端、前端的真实现场2.1 架构侧一次缓存拆分和一次不动声色的大扫除这一个月在架构侧做了两件事。第一件是给一个内部系统的核心读接口做缓存拆分。现象很典型同一份配置数据被多个服务分别查库高峰时数据库连接被打满接口P95到了32ms勉强能扛但很不健康。拆分思路是区分“热点配置数据”和“强一致数据”。热点配置数据允许分钟级延迟就给它加一层短TTL的二级缓存强一致数据继续实时查库。调整完之后读接口P95降到11ms数据库连接数下降了一大截。这个优化本身不复杂真正难的是说服自己“不是所有数据都该缓存”。这其实是架构设计里很基本的一课你不仅要考虑技术上限还要考虑业务对一致性的容忍度。乱缓存一定会带来脏读问题而脏读在配置类场景里往往比慢查询更可怕。我为了这个取舍想了挺久最后接受了一个原则——架构优化的本质是把不一致的风险控制到业务能接受的范围内而不是把技术栈换成看起来更酷的东西。第二件事有点琐碎但值得记录给一个遗留服务的依赖做了一次“不动声色的大扫除”。版本升级、移除无用依赖、调整配置项没有新功能纯减少维护负担。这类活儿没有KPI但必须有人做。月结里记一笔是为了提醒自己不是所有工作都必须亮眼让系统变简单本身就是架构工作的核心。2.2 云技术侧成本不是省出来的是算出来的云技术这个板块我这个月花了比较多篇幅在算账。先从成本说起。某服务每月流量费用一直在涨排查之后发现大部分是重复下载的静态资源。处理办法是给静态资源做压缩和更激进的缓存头同时把对象存储里的冷数据分层90天前的日志切到低频存储7天前的基本不访问的数据直接归档。一个月下来这块成本降了大概35%。我提醒自己别只记结论把账也算了一遍原来高频存储和低频存储的单价差大约在五倍左右日志类数据占比又大所以分层之后每个月省下的钱很具体。很多团队不做冷热分层不是不知道这个方案而是没算过这笔账。还有一次扩容反被流量打崩的经历。当时给某个计算任务临时加了节点结果发现任务并没有快多少反而因为调度层面的握手开销暴增整体吞吐还降了。后来才意识到云上资源不是加机器就等于加性能瓶颈在任务分片和调度策略上。这个教训很值钱上云之后性能优化重心从“买多少机器”变成了“怎么把饭吃干净”。2.3 算法与后端深翻页和N1到底亏了多少后端这边这个月集中处理了两个老问题都不新鲜但都很有代表性。第一个是分页接口深翻页变慢。某个列表接口翻到第100页之后越来越慢原因就是典型的limit 100000, 20MySQL要扫描并丢弃前面十万行才能拿到目标页。改成游标分页后P99从1.8秒降到120ms。我顺手算了一下这笔账当时平均翻页深度约五万行每页20条等于每次请求都要扫两千多行数据而真实用户里90%只看前几页真正会深翻页的其实是搜索引擎的爬虫。也就是说这个性能问题平时没人报但一旦触发数据库会被打得很惨。这就是典型的“低频高损”问题值得提前处理。第二个是N1查询。一个订单详情接口要展示几十条明细原来用循环查库每次请求查三十多次总耗时210ms。改法很简单一次查主表一次查明细表再用内存做关联耗时降到30ms。注意这里有个细节批量查询不是批越大越好。我按500条一组拆实测1000条效果差别不大但内存占用翻了一倍。批大小这个东西没有普适答案只能按自己系统的实际数据量去测。算法这块我重新看了一遍布隆过滤器用来做防缓存穿透的方案设计顺便复习了它的内存账。存1亿个Key把误判率控制在1%以内大概需要120MB的位图配合7个哈希函数如果愿意放宽到5%内存能降到约52MB。相比直接把原始Key放内存做校验这个方案省了差不多一个数量级。这类东西平时用不上但真到了缓存被穿透打爆的那天能把账算清楚比背结论有用得多。2.4 前端侧构建时间从127秒到49秒前端板块这个月动作不大但效果很直观。我升级了一个内部后台的组件库版本。表面上是一次例行升级实际上拆成了三件事迁移掉一批废弃API、把按需加载重新打开、删掉大概20%的无用样式。全部做完之后构建时间从127秒降到49秒打开控制台看首屏资源也小了不少。我复盘了一下为什么进度条能省这么多按需加载是主要原因无用样式清理是辅助废弃API迁移则是为了后续不踩坑。很多团队把版本升级当成“点一下按钮”结果升级完到线上才发现大量样式和逻辑失效。所以我额外加了一条规则升级完必须做一轮兼容性回归并且把目标浏览器范围锁死不为没人用的老版本做无谓兼容。还有一个观察。最近某个渲染方案讨论得很热我没有直接切先写了一个Demo对比包体积和加载耗时。结论是在重度交互的表格类页面收益明显在普通内容页反而没有优势。这个结论不重要重要的是过程——对一个技术“心动”的时候先跑一次最小验证比直接上生产要稳得多。2.5 定期更新与动态用“最低发布版本”保住节奏“定期更新”这四个字写起来轻飘飘执行起来全是承诺。这个月我做一个很重要的动作把更新日彻底固定下来并且在更新日前三天进入“素材冻结”状态之后不再允许自己往里加新东西。原因是人在临近发布时会疯狂想“再补充一个素材”结果越补越乱。冻结素材之后我开始收束只整理已经入库的内容。这个动作救了我。月中一度因为加班和感冒更新几乎断掉但我不允许自己空窗于是启用了“最低发布版本”策略哪怕只有三个板块能写完整也照常发标题上标注“简版”就好。动态方面这个月做了一次内部技术分享主题是一个索引设计失误引发的数据规模突变还给某个开源项目提了一个issue被维护者接受了。这种动态我没打算写多长记一笔就行是为了给未来的自己留一条线索知道这个时间节点我在关注什么。3. 输入线盘点收听/收看、英文、阅读、影视、好歌和新奇3.1 收听和收看通勤路上的输入靠的是固定节奏收听/收看板块是我这个月收获最大的一个板块因为通勤时间被利用起来了。我每天通勤大概四十分钟这段时间基本只做一件事听播客。这个月长期在听一档聊软件工程组织文化的节目名字不写了反正是那种聊“工程师和产品经理怎么共处”的类型它有一期访谈很打动我一位技术管理者说“需求变更频繁不是业务的问题是架构没有给变更留出位置”。这句话我记到现在已经变成了我在方案评审里常用的一个视角。看视频的时间没有听音频多但也在周末补了一个系列公开课讲分布式系统的一致性。这个内容我以前看过一遍似懂非懂这次再看突然通了不少。我发现“看懂”这个东西不是一次性的第一次看是混个脸熟第二次第三次才会真正沉淀下来。所以月结里不必要求自己每个输入都立刻产生输出允许它再发酵一个月。用听音频这件事我还有一个心得与其堆一大堆收藏不如连续两周只听同一档节目。固定的主播、固定的语速、固定的语境上下文会自然帮你补全生词和概念学习效率反而更高。3.2 英文与阅读原版书的三步走英文板块这个月没有搞什么激进计划就是每天坚持了大概十分钟的短文朗读加复述。我发现自己最大的问题不是词汇量而是语调和停顿。一旦把停顿的位置搞对了句子听起来就顺很多写邮件时也更敢开口表达。英文技术文献的阅读这个月推进了两个章节。我总结出一个“原版技术书阅读三步法”第一步先扫整章的图、代码块、小节标题给自己搭一个地图第二步精读图和代码弄清楚技术细节第三步回读正文这时候你会发现很多文字只不过是在解释你已经看懂的图。这个方法特别适合那种“大而全”的技术原版书直接从头读通常会睡过去。阅读方面中文书这个月读了两本。一本是讲系统性能分析的科普书作者把排查顺序讲得很接地气——先看现象、再猜原因、再验证。另一本是讲写作逻辑的书里面有一句话直接改了我的需求文档风格一个段落只讲一件事。这句话听起来简单但做起来需要很大的克制力。3.3 影视与好歌留一段不给KPI的时间影视这块这个月重看了一部老的推理片重新被它的叙事结构惊艳到。整部片子的主角动机一直不透明导演却能在保持悬念的同时让细节严丝合缝。这种“结构感”对我来说比剧情本身更有启发。还看了一部自然纪录片画面很宏大旁白却很安静。我不太想把看纪录片也变成学习任务所以把它当作一种缓冲期输入——看完之后没有笔记没有行动项这反而让周日晚上的时间变得完整。要提醒的是我在月末最后一周不小心开始追一部剧直接导致素材整理进度落后了两天。这件事我写进坑三了属于典型的“输入挤占输出时间”。好歌板块这个月听得最多的是器乐后摇滚、冷爵士和氛围电子。我要推荐一张听感很克制的器乐专辑没有大起大落但鼓点和贝斯线极其稳非常适合长时间写代码。有一首歌整首没有歌词但情绪推进像一部小电影。我越来越觉得“好歌”板块的核心价值不是安利哪首歌而是记录一个容易被忽略的情绪侧写——这个月我的状态是偏安静还是偏焦躁看歌单就明白了。3.4 新奇发现这个月让我拍案叫绝的小东西新奇板块是最容易自嗨的板块也是最容易过期的一个。这个月有四个记录。第一个是一个终端里的时间轴工具可以在命令行里维护个人事项用起来像是给终端装了效率本的技能。第二个是一个浏览器插件能把长文章重新排版成类似电子书阅读器的样式配适老眼昏花的我。第三个是一个开源的“个人书签库”方案能让所有收藏统一通过一个页面访问弥补浏览器收藏夹只能本地看的短板。第四个不算工具算冷知识一些鸟类并不只是会“记住”它们还能理解“零”这个抽象概念。这个事实让我重新想了一下“人脑独特性”这件事记录本身挺有意思。我给自己定了一个规矩凡是发现“神了”的工具归档时必须写清楚它解决了什么场景下的什么问题否则下个月自己看的时候根本想不起当初为什么激动。这大概也是新奇板块最需要注意的地方。4. 含泪总结月度复盘在实操中的六个坑4.1 素材太多不知道从哪下笔这个月一开始我积攒了60多个备选条目打开文档时整个人是懵的——每个都像要写但每个都写不深。后来我把所有条目按“事实、观点、问题”三个标签过了一遍只保留那些能写成一段话的剩下全部放进“待查”清单。最后真正写进月结的只有15条左右。这个动作我很想说清楚月度总结不是把所有收藏变成正文而是选出值得沉淀的。收藏是廉价的消化才值钱。4.2 链接失效和“收藏即完结”我整理素材时发现以前收藏的文章里有差不多两成已经打不开了。这就是“收藏即完结”的恶果——收藏的那一刻以为自己拥有了知识实际上只是存了一个随时会失效的地址。现在我的做法是凡是决定写进月结的链接必须在当天打开一次并把核心要点抄进笔记要是网页引擎版本比较旧直接存一份网页快照到本地公开推荐时我会顺手写一句“如链接无法访问可以按标题搜索”。这样做既给自己留后路也避免推荐内容彻底湮灭。4.3 固定更新被现实生活击穿月底正好赶上项目上线和搬家更新计划差点原地蒸发。我没有硬撑着写出一篇长文而是启用了“最低发布版本”。哪怕只有三个板块完整照常发标题上注明是简版。这种机制特别适合长期内容创作者与其因为一次断更内疚半年不如让发布系统里本身就预留一个低负载模式。如果连最低版本都发不了呢我的预案是在频道里发一条“本月盘点正在整理稍后补上”的说明并且不把它当成失败而是一次节奏调整记录。只要回到流程里下个月还能继续。4.4 常见问题与排查速查表我把这一个月踩过的坑以及之前积累的教训汇总成了一张速查表按“现象、根因、处理办法”三列来写月末评审和复盘时直接套用常见现象可能的根因我的处理办法月初没有素材平时没做收集全靠月底硬想每周日晚固定做一次十分钟素材盘点素材太多无从下手把收藏当成消化按“事实/观点/问题”打标只保留能写成段落的条目链接打不开原站删除或内容迁移当天打开一次核心链接关键内容抄进本地笔记写到一半想放弃完美主义作祟启动最低发布版本允许简版上线想写成大而全把月结当成论文给每个板块设字数上限超了必须删更新日被项目抢占没有给缓冲期更新日前三天冻结新素材不再追加内容复盘像流水账只记事情没有判断强制每个要点补两句这说明什么、下一步怎么做这张表我打算每月都更新一次新增的行会直接进入下一回合的“含泪清单”。这个板块从标题看像是卖惨实际上帮我省掉了大量返工时间。5. 给也想做月结的人一套可以照抄的开局方法5.1 起步期只保留四到六个板块我标题里确实列了十三个标签但真正稳定产出的其实是三大类里拆出来的六个固定板块动态、技术实践、输入推荐、收听收看的重点记录、英文学习进度、踩坑备忘。剩下的“新奇”“好歌”“影视”都是在有素材的时候才出现的替补板块。所以给新手的建议是起步阶段只保留四到六个板块别学标题里那一长串。板块越少越容易坚持等更新节奏稳了再往里面加内容。上来就追求大而全维护成本会直接把热情压垮。这个“含泪量”我替你试过了。5.2 开发属于自己的素材流水线不需要用多复杂的工具手机的备忘录、浏览器自带的书签、一本实体笔记都够用。重点是把五个动作跑顺收、读、断、标、存。“收”是看到值得留的东西就丢进统一收件箱不急着分类“读”是用两分钟判断它值不值得进一步处理“断”是决定它和本月主题有没有关系“标”是给它打上日期和来源“存”是放进“月结待整理”目录。这套流程总共大概十分钟但能让月末的检索时间减少一大半。我用第一回合的48小时和这一回合的约12小时作为对照数据已经说明问题。5.3 月末发布检查清单我把这个月的发布检查清单放在这里可以直接复制提前一周冻结新素材停止追加内容。把待整理素材按六大板块分拣。每个板块写三到五个要点别贪多。每个要点必须补一个最小细节比如耗时、参数、前后对比。通读一遍删掉所有“只说结论没说过程”的内容。发布后更新归档索引方便下个月往回查。这套清单最快三个晚上能跑完慢一点也就五个晚上。它最大的作用是让我在月底不慌因为每一步都是已知的、可执行的。写到这里我大概能概括出第二回合最真实的体验月度总结不是“记录一个圆满的月”而是承认很多事没有结果但仍然选择把它们摆出来看。含泪总结是因为它不轻松憋泪分享是因为三十天后回头望被自己随手记下的一个坑、一个细节、一次意外启发这种连续的正反馈是别处很难得到的。最后再分享一个可以立刻用起来的小技巧在手机里建一个叫“月末回顾”的固定便签每周日晚花三分钟把本周值得写进月结的东西丢进去。月底打开它你看到的不是空白而是一张已经整理了三分之一的草稿。如果你也在做类似的月结欢迎把你的踩坑经验告诉我我下个回合的含泪清单里说不定就有你贡献的一条。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进