《MMO 服务器开发》13.2 公会仓库与捐献流水
公会仓库是多人共享的资产容器,捐献则是一份只增不改的流水账。本节用 aegis 从零实现:仓库按物品种类限槽但允许无限堆叠,捐献用请求号幂等去重避免重试翻倍,提现按职位控权并按日限额。重点讲清「先判幂等再写库存」的顺序为什么是正确性的关键,并用真跑的 L1 测试验证重试不翻倍、超额提现被拦、跨日重置生效。
tag
公会仓库是多人共享的资产容器,捐献则是一份只增不改的流水账。本节用 aegis 从零实现:仓库按物品种类限槽但允许无限堆叠,捐献用请求号幂等去重避免重试翻倍,提现按职位控权并按日限额。重点讲清「先判幂等再写库存」的顺序为什么是正确性的关键,并用真跑的 L1 测试验证重试不翻倍、超额提现被拦、跨日重置生效。
公会系统是 MMO 里第一个跨玩家的持久组织:入会有自由与审批两种策略,职位有会长到成员五级,权限是一张职位到动作的位掩码表。本节用 aegis 从零实现单服公会模型——把权限收敛成一张可审计的表、让入会与审批幂等、把职位变更约束在层级之内,并用真跑的 L1 测试钉死满员竞态、重复申请与越级任免三条边界。
《Go 语言编程实战》全书导航页:说明本书与卷一《Go 语言编程入门》的分工、读者画像与前置知识、三条学习路径与五个部分之间的依赖关系,并按五个部分列出 18 章 54 节的完整章节索引,另含贯穿项目 TaskHub 从单模块到集群部署的推进路线与常见问题速查表,方便读者按需定位、跳读与随时查阅全书。
全书的最后一步是把 TaskHub 真正推到用户面前并让它长期变好。本节给出上线 Go/No-Go 清单、观测三支柱的接线,并用本机真跑的一段中间件演示:1000 次请求中注入 10 个错误,实测 1001 个请求、10 个错误、可用性 99.001%,据此判定错误预算是否耗尽;最后用「假设-实验-度量-决策」闭环收束全卷 18 章。
「高可用」不能靠假设,只能靠演练验证。本节真的把 TaskHub 的依赖停掉、注入延迟、再恢复,用真实数据检验它的失败行为:docker stop 掉 Postgres 后 30 次查询全部快速失败(1~3ms,无挂起),恢复后 30/30 成功;代码注入 2 秒延迟后 200/200 请求在 500ms 超时处被截断,P99 从 6ms 升到 508ms。
上线前的最后一道算术题是「这台机器到底能扛多少」。本节用本机真实的基准数据(M1 Pro 上 536.6 ns/op、1 alloc/op,并发 8 路 135.7 ns/op)做架构复盘与容量规划:从实测吞吐推算单副本容量,用安全系数与依赖瓶颈算出需要的副本数,并给出成本与冗余的权衡表。
《Go 语言编程实战》全 55 篇,以多租户任务协作平台 TaskHub 为主线,从单仓多模块与依赖治理、分层配置与密钥管理,讲到 REST 契约、JWT 与 RBAC 多租户隔离、连接池与事务边界、缓存与消息、限流熔断与 goroutine 泄漏,再到结构化日志、指标与链路追踪、分层测试与性能工程,最后覆盖对象存储、容器化、Kubernetes 部署、发布运维与安全加固。示例基于 Go 1.27 在本机实跑。
本附录把 Go 学习与实战中最常见的错误按「报错原文 → 原因 → 修法」整理:declared and not used、类型不匹配、nil map 写入、切片别名、goroutine 泄漏、context deadline exceeded、module path 不匹配、missing go.sum entry、import cycle 与中文乱码,每条都给出最小复现代码与修法。
本附录整理 go 命令与工具链的用法:build/run/test/vet/fmt/mod/get/work/generate/doc/env 各子命令、GOTOOLCHAIN 多版本、GOOS/GOARCH/CGO_ENABLED/GOFLAGS/GOPROXY 等环境变量,以及 -ldflags/-gcflags/-race/-cover 等构建标志,命令与输出均在 go1.27.0 实测。
本附录按「想做什么 → 用哪个包哪个函数」整理 Go 标准库常用 API:strings、strconv、bytes、time、encoding/json、os、io、fmt、errors、slices、maps、cmp、sync、context、net/http 与 log/slog,函数签名均用 go doc 在本机 go1.27.0 上核实,并配可运行的最小示例。
本附录把全书用到的 Go 语法与惯用法压缩成一组速查表:类型与零值、变量与常量、控制流、函数与 defer、切片与 map、字符串与 rune、结构体与方法、接口、错误处理、泛型与并发原语,每段片段都按「想做什么 → 怎么写」组织,并在 go1.27.0 上实测输出。
《Go 语言编程入门》全书导航页:说明本书定位、读者画像与前置知识、三条学习路径与六个部分之间的依赖关系,并按六个部分列出 18 章 54 节的完整章节索引,另含序、前言、附录 A–D 与常见问题速查表,方便读者按需定位、跳读与随时查阅全书。
《Go 语言编程入门》的序。从 Go 今天在语言生态中的位置谈起,说明站内既有的 Go 专题做的是「单点深挖」、这本书补的是「从零到能干活」的递进路径,并交代本书的三个刻意取舍、对「Go 啰嗦」等常见误解的回应,以及不同起点的读者该从哪一章进入这趟旅程。
《Go 语言编程入门》前言:说明本书的目标读者与前置知识、六部分 18 章的结构分工、每一节的组织方式、代码与工具链约定、Go 1.27 的版本基线与三种阅读路径,并给出各部分的学习时长估算,以及发现疏漏时该如何提交勘误与反馈意见,方便你快速建立对全书的整体预期。
为 TaskAPI 收口上线:跑 vet 与 -race 测试、看逐函数覆盖率、写发布构建脚本产出多平台静态二进制、打包 tar.gz 并生成 sha256 校验和,配发布检查清单与上线后验证,最后回顾全卷 18 章的演进与下一步学习方向。
把 TaskAPI 的四层装配成完整链路并实跑:从 main 的手工 DI 到 httpapi 的路由、store 的实现、领域校验,补齐 PATCH/DELETE 与统一错误响应,用 -race 跑测试、用 curl 走一遍创建到删除的端到端,复盘装配顺序与并发安全的关键决策。
对 TaskAPI 做一次完整复盘:从用户故事与非功能需求出发,梳理分层架构、包边界与 HTTP 契约,回顾从第 1 章到第 17 章的演进轨迹,并逐条复盘关键架构取舍——接口抽象的判据、内存到数据库的平滑迁移、错误分层与并发安全,最后列出收口清单。
《Go 语言编程入门》全 61 篇,以 TaskAPI 一个贯穿全书的项目为主线,从安装工具链、语言基础、结构体与接口、错误处理、包与模块、测试与泛型,讲到 goroutine 与 channel、同步与竞态、context 生命周期,再到用 net/http 搭服务、数据持久化、配置分层、可观测性、交叉编译与容器化交付。示例沿用 Go 1.27 主线,本页列出全书分章目录;代码与实验的复现范围以分节说明为准。
队长掉线了,谁带队进副本?本节把「掉线」与「退队」拆成两件事:掉线只灭在线标志、保留座位等重连,超时未回才回收;队长一掉线立刻按加入顺序把队长位交给下一位在线成员,且重连后不归还。全部用 go test -race 真跑,并讲清它与卷一顶号、重连的衔接。
上一节把入口控制收成了一处判断,但「先 Count 再 Add」这个写法本身在并发下就是错的:两个邀请可能都看到空位,把队伍撑到 5 人。本节把满员判断与写入压进同一个临界区,再把「满员校验 + 匹配锁定」也做成原子操作,用 go test -race 复现并证明修复。