这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《MMO 服务器开发》15.2 附件、过期与流拍结算
邮件带上附件之后,「领取」就不再是读一下就完事,而是一次必须恰好一次的资产发放。本节给 aegis 补上附件领取、过期扫描与流拍结算:为什么领取要按槽位记账、过期的未领附件为什么不能凭空消失,以及流拍返还的物品最终怎么折算成绑定货币,附真跑通过的 L1 测试。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
邮件带上附件之后,「领取」就不再是读一下就完事,而是一次必须恰好一次的资产发放。本节给 aegis 补上附件领取、过期扫描与流拍结算:为什么领取要按槽位记账、过期的未领附件为什么不能凭空消失,以及流拍返还的物品最终怎么折算成绑定货币,附真跑通过的 L1 测试。
邮件是 MMO 的万能投递通道,活动奖励、GM 补偿、拍卖结果、系统公告全走它。本节从零给 aegis 写一个可跑的邮箱内核:容量上界怎么定、全服邮件为什么不能扇出成 N 条存储、以及投递去重为什么不能只在邮箱里查 ID,并把它和卷一的幂等窗口接上,附 12 条真跑通过的 L1 测试。
赛季结算真正的难点不在发奖,而在边界:最后一秒还在涨分怎么办、崩溃重试会不会重复发奖、结算读的是活榜单还是快照。本节给 aegis 的 rank 包写一套可测的结算流程——冻结快照、按名次分档、发奖幂等,并给出赛季窗口的半开区间判据,把「哪一 tick 属于哪个赛季」钉死。
朴素榜单每次查询都重排,读路径太贵;真要把排名做到 O(log n),得让写入时就维持有序。本节给 aegis 的 rank 包加两样东西:把同一玩家的连续涨分压成一次改动的写缓冲,以及带 width 的跳表——它每一层记着跨过的节点数,于是「我第几名」不用数一遍就能直接算出来。
排行榜看着只是「按分数排个序」,可一旦塞进一张表用 ORDER BY 去查,读放大、写入热点、并列名次和「我的排名」四件事会同时把它压垮。本节先讲清排行榜真正要回答的问题、为什么一张表不够,再在 internal/rank 包里写出一个正确但注定会崩的朴素榜单,作为后两节优化版的对照基线。
公会战的第一步是报名与锁定:报名只能在开窗时段内、由持有报名权限的成员发起;名单必须在截止时刻一次性冻结,之后入会或退会都不再改变参战名单。本节用 aegis 从零实现报名窗口、权限校验与名单快照,讲清锁定为什么必须幂等,并说明卷二只做单服内的报名与锁定,真正的跨服对战留给卷三,最后用真跑的 L1 测试钉死窗口边界、权限与冻结。
公会仓库是多人共享的资产容器,捐献则是一份只增不改的流水账。本节用 aegis 从零实现:仓库按物品种类限槽但允许无限堆叠,捐献用请求号幂等去重避免重试翻倍,提现按职位控权并按日限额。重点讲清「先判幂等再写库存」的顺序为什么是正确性的关键,并用真跑的 L1 测试验证重试不翻倍、超额提现被拦、跨日重置生效。
公会系统是 MMO 里第一个跨玩家的持久组织:入会有自由与审批两种策略,职位有会长到成员五级,权限是一张职位到动作的位掩码表。本节用 aegis 从零实现单服公会模型——把权限收敛成一张可审计的表、让入会与审批幂等、把职位变更约束在层级之内,并用真跑的 L1 测试钉死满员竞态、重复申请与越级任免三条边界。
灰度让新旧两版代码同时在跑,于是 schema 变更不能一删了事。本节讲 expand–contract 五阶段迁移法,并在本机 Postgres 17.11 上用 psycopg 真跑一遍:加新列、双写、回填、切读、删旧列,每阶段查询验证新旧两列一致,另演示 DDL 锁表与 CREATE INDEX CONCURRENTLY。
Agent 服务的发布对象不只是代码,提示词、模型 ID、工具集、检索参数都是可发布的配置,改提示词的风险不低于改代码。本节设计按流量比例的灰度与自动回滚条件,真跑一个灰度路由器:新版正常时放量、新版劣化时按成功率/成本/P95 三个条件触发一键回滚,并演示影子流量。
本节把 ResearchCopilot 的 CI 串成一条分阶段流水线:静态检查 → 单元测试 → 评测质量门 → 构建镜像,按「快先跑、贵后跑」排序。真跑 compileall、pytest、评测夹具回放与 docker build,打印每段真实退出码,给出一键脚本与 GitHub Actions 形态。
把图书借阅服务构建、打包并运行起来:给出 mvn clean package 的完整流程与真实构建输出,讲清本地运行的三种方式(java -jar、mvn spring-boot:run、IDE),用 curl 走通从建书、查书、借书、还书到分页查询的完整业务闭环,运行测试套件,分析打包体积与启动时间,最后给出实战卷与高级卷的学习路径和一份全书自查清单。
按 18.1 的设计逐层实现图书借阅服务:实体与 Repository(派生查询与 @Query)、Service 事务边界与业务校验、Controller 参数校验与统一响应、全局异常处理,并给出多环境配置组织、Flyway 迁移脚本、实现顺序与每步验证方法,以及三类常见实现偏差。
用一个「图书借阅管理服务」把前 17 章串成完整项目:梳理增删改查、借阅归还、分页查询的用例,设计实体关系、Controller/Service/Repository/DTO 分层与依赖方向,给出接口清单、数据库表结构、Flyway 迁移脚本、错误码与统一响应结构,并列出技术选型与对应章节。
集成测试启动完整 Spring 容器,验证跨层协作。本节讲清 @SpringBootTest 的 webEnvironment 四个取值、4.x 下 TestRestTemplate 需显式开启、上下文缓存与 @DirtiesContext、测试数据隔离的三种策略,并用 Testcontainers 2.0 接入真实数据库,最后给出三层测试的选择速查表。
切片测试只加载需要的那一层,比集成测试快得多。本节用 @WebMvcTest 测 Controller、@DataJpaTest 测 Repository、@JsonTest 测序列化,讲清 4.x 必须显式加 @AutoConfigureMockMvc、用 @MockitoBean 取代旧注解,并给出 3.x 到 4.x 的迁移对照表与新增的 RestTestClient 用法。
单元测试是测试金字塔的底座,也是唯一不需要启动 Spring 容器的测试。本节讲清 JUnit 5 的核心注解与断言,重点演示 Mockito 的 @Mock、when、verify 与 ArgumentCaptor,并说明 4.x 下用 @ExtendWith(MockitoExtension.class) 集成 Mockito 的正确方式,最后为图书服务写出一组单元测试。
《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。