配置写在代码里的第 100 天,我终于建了配置表
阈值、开关、白名单……这些东西写进代码的那一刻,就注定了以后每次改动都要发版。
阈值、开关、白名单……这些东西写进代码的那一刻,就注定了以后每次改动都要发版。
Kafka、RabbitMQ、RocketMQ 的对比文章满天飞,但选型的第一步是回答「你的消息是什么形状的」。
老项目里的 jQuery 不是原罪,写得糙才是。几条老规矩,今天依然适用。
手动运行一切正常,挂到计划任务上就各种失败。起因网点、工作目录、账户权限,三处经典坑。
版本管理的本质是给演进留退路。三个决策点:版本放哪、什么时候升、旧版本留多久。
为了把图片灰度化从 400ms 压到 90ms,我用了 unsafe。这是那十二行和它教会我的事。
排查问题时最痛的不是没有日志,是日志里没有线索。三条纪律,让日志能救你而不是烦你。
ziplist、intset、ziplist 阈值、内存碎片率——小机器上的 Redis 每一分内存都值得计较。
多阶段构建、换基础镜像、合并 RUN、清缓存。四招下来,构建和部署都快了一大截。
都在保活,但一层管连接、一层管穿透、一层管会话。混着配的时候坑就来了。
EXPLAIN 三次,结论三次都不一样。最后救它的不是索引,是一个写法习惯。
HATEOAS 没人做,PUT/DELETE 全项目用不上几个,但这不妨碍我们做一套好用的接口。
没有超时的调用等于永远在等,没有退避的重试等于二次攻击。三条纪律把外部依赖管起来。
背熟 60 个状态码不如吃透 8 个。200/204/304/400/401/403/404/429 之外,大多数都是礼貌性出现。
产品要按天、按渠道、按版本三个维度统计崩溃率,单字段索引不够,$facet 来救场。
都是 B+ 树,但聚簇、回表和页面分裂的表现完全不一样。从 MySQL 迁 PG 前最好先看这篇。
任务错过了触发点到底补不补跑?WithMisfireHandlingInstructionDoNothing 不是万能挡箭牌。
无服务、零配置、单文件、公共领域。当「数据只有一个写入方」时,SQLite 往往是最对的那个答案。
计数器、滑动窗口、漏桶、令牌桶——先分清你保护的是自己还是下游,选型就清楚了。
粘包不是 bug,是 TCP 的本性。字节流之上,消息边界要自己画。
Substring 每次都在堆上造新串。Span 让你「切片」而不「复制」,托管代码照样能跑进微秒级。
Nginx 能做的事很多,一个内部系统的反代需求其实就三段配置。抄下来改改就能用。
网络重试是常态不是异常。把「每条请求都是新的」这个假设扔掉,幂等设计就入门了。
告警响了别慌,按固定节奏走一遍:定位进程、定位线程、定位代码。十分钟内基本能说出个所以然。
绝大多数对象朝生夕死——这一条经验假设撑起了整个分代回收。理解了它,调优思路就顺了。
N+1、全表跟踪、客户端求值。三个坑都不深,叠在一起就是接口超时。
缓存策略本身不难,难的是「谁该强缓存、谁该协商」这组搭配。用一张表说清楚。
正则写得再顺手,嵌套量词一上场就是指数爆炸。这次事故让我记住了两个写法红线。
明明设置了 Access-Control-Allow-Origin,为什么还是报跨域?因为浏览器的动作比你想的多一步。
两人小队也能吵起来:feature 分支到底该 rebase 还是 merge。吵不出结果,就定规则。