专门写这一篇文章,是因为曾经遇到过有同事不熟悉数据库,甚至没用过 EXPLAIN,当遇到慢 SQL 之后,第一反应往往是问有经验的人。所以,本文不会假定你对数据库有很高的熟悉程度,但是写 SQL、建索引这些还是得会的,部分超出范围的内容也都有讲解。执行 EXPLAIN,屏幕上很快…
测试环境和生产环境到底差在哪?资源少的时候,问一圈同事,翻翻控制台,大概还能找到答案。当网络、数据库、IAM 和 Kubernetes 集群分散在几个平台,随着时间的流逝,这个答案就很难获取了,更不用说再搭一套相同的环境了。基础设施即代码 (Infrastructure as C…
后端服务引入消息队列,开始时往往只是为了把一段耗时操作放到后台执行。后来又会加入事件通知、失败重试、广播、顺序消费和历史重放。看起来都在发消息,实际需要的存储方式和消费模型并不相同。选型时最容易比较的是吞吐和延迟,这个数字很重要,但有些问题更值得关注,例如消息丢失后如何恢复、扩容…
服务出了问题,通常先从指标发现异常,再到链路中定位耗时,最后结合日志查明原因。实际使用时,这三类数据往往来自不同的采集工具,字段名称也不一致。指标里叫 service,日志里可能叫 app_name;链路中有 trace_id,日志却没有记录。数据虽然都在,查询时却很难互相关联。…
Kubernetes 资源可以用 kubectl apply 部署,也可以交给 CI 在流水线中执行 Helm。服务不多时,这些方式足够简单。集群和环境增加以后,问题会逐渐出现:生产环境究竟对应仓库中的哪个版本?有人临时修改了 Deployment,Git 中的配置是否仍然有效?…
在《博客重构》里,我专门解释过为什么选择 Mantine:我熟悉它,组件足够全,拿来就能用。那次重构的第一目标是尽快把博客从 Hexo 搬到 Next.js,而不是先花几个月造一套按钮、卡片、抽屉和响应式布局。Mantine 很好地完成了这个任务。问题是,将近一年之后,目标变了。…
用过 Hetzner 的人大概都知道 Abuse 邮件不能随手归档。有些工单要求限时解释或处理,拖久了可能影响服务器乃至账号。不过,这次邮件正文明确写着不必回复,真正要做的是先弄清楚:我的服务器为什么会出现在一份恶意软件通信报告里?当时正在给 Mantine 迁移到 StyleX…
这几年间,无数人、组织都在问同一个问题:AI 到底怎么落地?但是似乎无论是什么场景和项目,所谓落地,都会落到技术负责人头上。怎么回事儿?离了程序员,我还吃不上肉了?我现在就让 AI 自己写程序让自己落地!无论是投资人、老板还是管理层,最终都会到一个是或者类似技术负责人的角色这里,…
Bun 的入门文档很好懂:定义结构体,写几个 bun tag,然后 NewSelect、NewInsert、NewUpdate。照着示例做,半小时就能把一张表增删改查一遍。可项目真正复杂起来以后,问题通常不再是「左连接怎么写」,而是另外一组东西:事务里的 Repository 为…
第一次听到 /'reɪdiəs/ 联想到的单词肯定是 Radius,但是如果听到的是 RADIUS 协议,就不得不怀疑自己的耳朵了,半径协议是什么?当然,如果是看到 RADIUS 这个词就不会有这个疑惑,全大写意味着是首字母的缩写形式,就像 HTTP 协议一样。但是和 HTTP …
推荐个 VPS 呗?这个问题经常听到,现在统一推荐一下。其实这个问题很宽泛,所以每次都需要先反问:你的用途是什么?然后在脑中过滤一遍,再继续问:预算多少?对位置有要求吗?需要什么配置?像挤牙膏似的一点点问,最终也很难得到答案。一家厂商的 VPS 怎么样,本质上都得自己买来实际用了…
你怎么给你的电脑安装软件的?是不是缺什么装什么,图形软件去官网下载,命令行工具用 Homebrew,Node.js 交给 nvm,Python 再装一个 pyenv。可能刚装完都挺好的,过上一年,~/.zshrc 里就会长出好几段初始化脚本。此时再问一句「现在运行的 node 到…
一个新网站刚上线,最先出现的访客往往不是读者,而是扫描 .env、寻找 WordPress 后台和尝试 SSH 登录的自动程序。当然,检查结果一般不通知你。很多人最初接触 Cloudflare,只是把网站的 DNS 记录设为已代理(Proxied)。继续翻控制台才会发现,它管的远…
上一篇《博客重构》里,我把目标写得很明确:完成基础设施,把精力转回内容。博客确实能用了,修改却没有停。搜索框里的状态、手机上的目录、切换页面时的代码高亮,每个地方单看都不大,连起来却足够再折腾一轮。这也不完全是闲不下来。有些问题只有放进真正的阅读过程才会出现:输入拼音时要不要立刻…
很久很久之后,记录一下关于游泳的思考。怎样才算学会游泳,本身就很难定义。所以本文不聊怎么学会游泳,改聊聊其他的。游泳这项运动,对身体素质有三个方面的要求:柔韧性、力量和协调性。我们就聊聊这个对几种泳姿的影响,以及一些成人学习游泳会遇到的问题。其实第一个问题和身体素质没关系,而是已…
假设有一张再普通不过的订单表:主键是 id,用户经常按 status 查询,后台又不断更新订单状态。CREATE TABLE orders (id bigint PRIMARY KEY, status varchar(32) NOT NULL, buyer_id bigint N…
如果 CPU profile 里 runtime.gcBgMarkWorker、对象扫描和分配路径长期霸榜,GC 才值得被请出来背锅。高频 JSON 解码、临时字符串和一地鸡毛的小对象,都会把 GC 累得够呛;锁竞争、网络调用和慢查询造成的延迟,则不是给 GC 换个名字就能治好的…
明明建了索引,数据库为什么不用?这是数据库问题里最常见、也最容易误判的一类。表上有索引,查询条件里也写了索引列,EXPLAIN 却给出一个 Seq Scan。把 enable_seqscan 关掉,索引突然又能用了。于是很自然地会得出结论:规划器选错了,或者它的成本估算与实际情况…
如果你还没有承受过高并发的毒打,或者接手了一份充满时代印记的古董代码,那么相信本文会给你指出一条踏向加班的不归路。当然,如果你是在操刀一个全新的项目,将本文的规则枷锁套在身上前行,你会走得更慢,但是你能走得更远。所谓的性能问题,本质上大多源于你对手里的东西了解得还不够透彻。偏偏现…
很多人第一次拿到一家公司的年报,会先翻到「净利润」那一行,然后决定这家公司赚钱还是亏钱。这个动作很自然,也很危险。一家企业可以利润很高,却没有足够现金发工资;可以账上现金很多,却是刚借来的钱;可以收入增长很快,却把大量货物压在仓库里;也可以连续几年亏损,却正在用今天的投入换取未来…