54ADMIN · 后端架构与前端工程实践
54ADMIN 技术博客,聚焦后端架构、前端工程、数据库与运维实践,持续输出可落地的工程经验、源码解析与踩坑复盘。
最新文章
Laravel 用数据库事务与悲观锁守住并发写:transaction、lockForUpdate 与避免死锁
并发写最怕两件事 余额扣减、库存扣减这类操作,多个请求同时进来,读到的旧值一样,最后一起写回,就会丢更新。解决靠两把锁:数据库事务保证原子,悲观锁(lockForUpdate)保证读的时候就堵住别人。 用 DB 门面写事务 use Ill...
Rust 用 Axum + Tokio 写 WebSocket 服务:广播、心跳与连接清理
需求:一个能广播的实时通道 聊天、行情、协作编辑都要服务端主动推。Axum 的 ws 提取器把握手交给框架,我们只需在 on_upgrade 之后拿到 socket 自己处理。下面是一个带广播和心跳的最小可用服务。 全局状态放一个广播通道...
Go 用 zap 搭建生产级结构化日志:字段、分级、采样与日志轮转
标准库够用,但生产不够快 Go 标准库的 log 没有结构化字段,slog 解决了结构但默认实现偏简单。在高频服务里,zap 的零分配 JSON 编码和级别采样能明显压低日志开销。下面搭一个能直接用在生产的结构化日志。 核心:Encode...
Vue 3 非响应式逃生舱:markRaw、toRaw 与 shallow 系列的正确分工
响应式不是免费的 Vue 的 reactive 会把对象递归地包成 Proxy。问题是:遇到第三方实例(图表、编辑器)、超大数组、或者你根本不想追踪变化的对象,深度代理既浪费性能也可能让第三方库出错。Vue 提供了一组“逃生舱”:markR...
React 用 SWR 做客户端数据请求:stale-while-revalidate、本地更新与焦点重验
为什么还要看 SWR 服务端状态(接口数据)和客户端状态(表单、UI)本就是两回事。TanStack Query 功能更全,但 SWR 更轻、概念更少:它只做一件事——基于 stale-while-revalidate 策略,让缓存数据先返...
Laravel 自定义异常处理器:把异常收敛成统一 JSON 响应
为什么要统一异常出口默认情况下,Laravel 在 debug 开时会吐出带栈的 HTML 错误页,关了又只给个 500。前后端分离的项目更需要一个结构稳定的 JSON 错误体:固定字段、可机的 code、可追踪的 traceId。本文重写...
Rust 异步流实战:用 futures::stream 做并发拉取与背压
为什么用 Stream一次拉一个 future 用 await 足够;要处理“一串异步产生的值”(分页抓取、消息订阅、文件分块)时,Stream 比手动维护 Vec 干净得多。futures crate 的 StreamExt 提供了 ma...
Go 用 ent 构建类型安全 ORM:实体定义、关联与代码生成
为什么选 entGORM 用反射在运行时拼查询,字段名写错要等跑起来才发现;sqlc 把 SQL 编译成 Go 但偏向手写 SQL。ent 走另一条路:用 Go 代码描述 schema,再用代码生成器产出带类型的方法和查询构造器,字段名、关...
Vue 3 代码规范实战:用 ESLint、Prettier 与 lint-staged 把风格问题拦在提交前
为什么要把规范拦在提交前代码评审里最没价值的争论就是格式:缩进几个空格、单引号还是双引号、import 顺序。把这些交给工具,人和人只评审逻辑。本文用 ESLint + Prettier + lint-staged + husky 在 gi...
React 与 TypeScript 类型进阶:用泛型组件与可辨识联合把 props 严丝合缝
为什么要在组件上做类型收敛很多团队把组件的 props 写成宽松的 any 或大而全的可选字段,结果运行时才暴露“少传了一个字段”或“传错了类型”的问题。React 配合 TypeScript 可以把这一类错误前移到编译期。本文用两个具体手...
