Blog

技术博客

格达软件工程师的实战经验、技术选型与行业观察

G 技术分享

200 行写个 ORM,看清 SQLAlchemy 的 Session

从一段 N+1 的导出脚本讲起,用 200 行实现一个能跑的迷你 ORM,把描述符映射、identity map、flush 时机这几个 SQLAlchemy 核心机制拆开看,再给出它的失效边界:批量插入、懒加载、长 session 的坑。

2026-11-06 #Python#SQLAlchemy 5
G 技术分享

6 人团队维护 12 个微服务:拆分失败的代价和替代方案

用一次真实拆分复盘,算清 10 人以下团队上微服务的三笔账:运维、联调、分布式故障,并给出模块化单体的边界约束代码、可逆的远程调用改造方式,以及团队到底到多大规模才该拆的判据。

2026-11-05 #微服务#单体架构 4
G 技术分享

我给本地缓存加了 TTL 和 LRU,踩了三个并发坑

从一个风控服务的真实场景出发,手写一个带过期时间和 LRU 淘汰的进程内缓存工具类。讲清链表与 Map 的并发删除竞态、时间源选择、清理线程的两个陷阱,以及缓存击穿的处理方式。

2026-11-02 #Java#本地缓存 5
G 技术分享

Docker 多阶段构建:Go 镜像从 1.1GB 到 12MB

一个 Go 服务用最朴素的 Dockerfile 构建出来 1.11GB,改一行代码要等 47 秒。这篇拆开每一层看体积从哪来,用多阶段加 BuildKit 缓存把它降到 12.4MB、热构建 3 秒,并列出走到 distroless 和 scratch 之后必然会踩的坑:动态链接、CA 证书、时区、没有 shell。

2026-10-28 #Docker#多阶段构建 3
G 技术分享

支付回调被重推三次:幂等表、状态机与退避重试怎么配合

支付回调天然会重复。本文从一次重复发货的线上故障切入,讲清楚幂等键怎么选、为什么只能靠数据库唯一索引兜底、状态机如何接住乱序回调、重试该放在哪里,以及几个真正会出事的地方。附可运行的 Spring Boot + MySQL 代码。

2026-10-24 #支付回调#幂等设计 7
G 技术分享

老 Service 补单测:先切接缝,再写断言

面向跑了几年的 Java 老项目:在不改调用方的前提下,用接缝把 new、静态配置和系统时钟扒出来,配上可复制的 Mockito + JUnit5 示例、JaCoCo 增量覆盖率门禁,以及静态初始化、误连生产配置、H2 方言这三类实测踩过的坑。

2026-10-21 #单元测试#遗留代码 5
G 技术分享

订单表涨到 8000 万行,我劝你先别急着分库分表

订单表到了八千万行就必须拆?先看一条慢 SQL 再决定。这篇讲清分片键怎么选、基因法让订单号自带路由、跨分片分页与 count 的正确写法,以及事务、扩容、运维要付的真实代价。

2026-10-20 #分库分表#MySQL 9
G 技术分享

库存不足返回 500,网关重试把库存打成了负数

订单接口在库存不足时返回 500,客户端 SDK 和网关各重试一次,库存被扣成负数。这篇文章把 4xx 和 5xx 的分界线划清楚:哪些错必须让调用方看到 4xx、哪些错重试真的有用,以及状态码选错之后监控、熔断、CDN 缓存会怎么一起塌。

2026-10-18 #HTTP 状态码#API 设计 8
G 技术分享

PostgreSQL 联合索引:顺序写反,多读 40 倍页

200 万行的订单表上,同一句按商户查订单的 SQL,只因为联合索引里列的顺序不同,扫描的数据页差了 40 倍。这篇用可复现的建表脚本和 EXPLAIN 输出,讲清楚等值、范围、排序列在 B-tree 里各自能做什么,以及哪些写法会让索引直接白建。

2026-10-17 #PostgreSQL#索引优化 4
G 技术分享

支付回调重复了 3 次,我的幂等设计漏在哪

第三方支付回调会在 24 小时内重试 9 次,客户端超时也会重发。这篇用一个真实对账事故,讲清幂等键怎么选、唯一索引和 Redis 各挡哪一层、状态机为什么是最后防线,以及幂等记录该留多久。

2026-10-14 #幂等性#支付回调 10

有软件开发需求?我们 24 小时内响应

提交您的需求,格达软件将为您提供免费的需求评估与技术方案建议,咨询全程不收取任何费用。