生产系统里最不起眼、又最容易在并发下翻车的代码,大概就是「查最大单号然后加一」这种两行取号。上周就撞上了一次:两位仓管员前后差 2 秒各做了一笔外部调拨,落库后两张调拨单单号相同,第二笔回写 ERP 时被对方系统以「编码唯一性要求:该编码已被使用」拒收。
排查根因、评估方案、换成 Redis 原子发号、真机并发压测验证,一路走下来,恰好把 Redis 的一大串面试高频考点串成了线。这篇文章先复盘事故与修复,再把考点一次讲透。
生产系统里最不起眼、又最容易在并发下翻车的代码,大概就是「查最大单号然后加一」这种两行取号。上周就撞上了一次:两位仓管员前后差 2 秒各做了一笔外部调拨,落库后两张调拨单单号相同,第二笔回写 ERP 时被对方系统以「编码唯一性要求:该编码已被使用」拒收。
排查根因、评估方案、换成 Redis 原子发号、真机并发压测验证,一路走下来,恰好把 Redis 的一大串面试高频考点串成了线。这篇文章先复盘事故与修复,再把考点一次讲透。
一套跑在 K8s 上的 MES 系统里,辅助服务 Pod mes-app-assist 频繁重启:kubectl describe pod 显示容器因 Liveness 存活探针连续失败,被 kubelet 强行终止(退出码 137 / SIGKILL)。
Liveness probe failed;nofile)过低——worker 进程软限制仅 1024。并发连接持续累积后,Nginx 报 24: Too many open files,既无法建立到后端 NodePort 的 socket 连接,连返回错误页 50x.html 的文件句柄都拿不到,经它转发的请求只能以 HTTP 500 或超时收场;系列二十五篇本已完结,但运维线一直是个缺口——前面讲过的”K8s 部署痕迹”(云主线的 pod 配置、物联篇的 0 号节点)都只是切片。这两篇增补把切片拼成整图:本篇讲一套生产 K8s 部署清单——CentOS 7 自建集群上跑全套 MES 微服务,外加完全自建的 Prometheus 告警监控栈;下一篇讲 MySQL 的物理备份一键化与恢复演练。
先修正一个容易望文生义的误解:这个项目叫 install-k8s,但里面没有一行安装脚本——它是部署清单(manifests)仓库,K8s 集群本身装好后,”把 MES 搬上去”的全部知识都沉淀在这三十八个 YAML 里。这个定位本身就值得说:集群是易耗品,清单才是资产——装集群一天的活,调清单调了一年。
系列写到这里,机制、交付、端侧、工具链与运维已经二十四篇,本篇是检索层:把散在二十四篇里的考点按”面试官的提问路径”重排成索引,补上一直欠着的导出与归档拼图,最后画出”一个底座、多种交付、多端工具链”的项目经历地图。面试备战材料写完不难,难的是面试前 30 分钟能不能翻到要复习的那一段——本篇就是为那 30 分钟设计的。