模块边界、数据所有权与架构决策
模块边界、依赖方向与架构风格
前置:理解请求标识、库存扣减及对象的可变状态;Python 3.10+ 用于单进程串行库存模型,不要求数据库或消息队列。教学范围为Parnas 1972信息隐藏;单进程端口适配;Python 3.10+。核对日期2026-10-17。示例未执行,本轮没有安装依赖、生成协议代码、启动服务或浏览器预览。完整文件与输入见库存请求去重与完整内存模型;推演结论只适用于写明的模型。
模块如何划分
模块如何划分先列变化决策,例如存储方式、编号规则和外部消息格式,再通过信息隐藏把各决策集中在模块内部。按流程每一步建模块不一定隔离变化;一次业务修改若穿过很多边界,说明边界可能暴露了不该共享的细节。
依赖方向与端口
依赖方向与端口让业务规则依赖明确能力,适配器负责存储或外部协议细节。端口不一定是语言interface,函数与协议类型都可表达。领域函数若直接拼供应商请求,换供应商就要改业务逻辑,测试也被外部环境绑住。
单体与微服务代价
单体与微服务代价不能只按代码量判断。单体共享部署与事务边界,微服务增加网络、兼容升级与可观察性成本,换来某些独立部署能力。模块边界尚未清楚时直接拆服务,会把内部耦合搬到网络上并增加失败模式。
端口隔离的是变化决策
库存服务要求“预留成功且不能负库存”,不要求具体 SQL 或 Redis 命令。端口描述这项能力,适配器处理存储细节。图中实线是调用方向,虚线是实现关系;依赖接口仍需明确事务与并发契约,不能只验证方法名相同。
查看图表代码
来源与适用边界
- 英文官方、作者或规范原文:本专题机制依据;按上述固定版本族阅读。
- 中文官方或作者资料:用于术语和讲解交叉核对,冲突以原始规范为准。
把微服务治理阅读提纲变成约束问题
微服务治理提纲 Consul gRPC 限流熔断要回答什么?旧提纲记录 Consul 注册发现、gRPC 负载均衡、限流、熔断和 Service Mesh,尚无实现或选型结论。保留原 Go 微服务治理阅读入口作为历史出处,不把产品名当完成方案。
注册发现先问实例如何注册、健康检查失败何时摘除、客户端多久更新缓存;仅有地址列表不能保证故障实例不被继续调用。负载均衡再问决策发生在客户端、代理还是服务网格,长连接和重试会怎样影响分布;这与 HTTP 请求逐次分配不是同一前提。
Service Mesh 能替代业务一致性设计吗?限流要说明保护对象、计数范围与拒绝语义;熔断根据观察到的失败暂时停止请求,还要规定半开探测和恢复,不能代替并发限额。Service Mesh 可能承载部分通信策略,但数据一致性、接口语义和业务补偿仍需服务负责。选择之前先列可观察信号、故障边界与维护成本;旧空标题不再呈现为已完成的治理教程。本节只有设计问题推演,未启动组件或验证服务拓扑。
数据所有权、事务边界与事件交互
数据所有权与事务边界
数据所有权与事务边界需要明确唯一写入者和跨模块约束。两个服务共同改一张表会绕过各自契约;同步调用成功也不等于跨服务原子提交。先决定一致性需求,再选择本地事务、事件通知或补偿,不把“最终一致”当免责口号。
同步调用与事件
同步调用与事件都需要错误契约。同步让调用方等待并引入时间耦合;事件解耦接收时刻,却要处理重复、乱序与可观察延迟。画图时同时标记失败分支和数据责任,只有成功箭头的时序图不能支持恢复设计。
架构决策记录
架构决策记录写出约束、替代方案、选择和后果。例如内存库存适用于单进程课堂推演,不适合跨实例共享;替换持久仓库不是只改一个类名,还需事务、并发和恢复语义。决策随证据复核,不把个人偏好伪装为普适规律。
提交与通知之间的故障窗口
假设订单状态和待发送事件由同一服务拥有,可以在一个本地事务内一起记录,发送器再投递事件。发送成功但登记结果前崩溃会导致重复,因此消费者仍须去重。这个方案缩小“已提交却永远没通知”的窗口,但不把消费者操作纳入原事务;它是设计示例,并非本文内存程序已实现的能力。
查看图表代码
来源与适用边界
- 英文官方、作者或规范原文:本专题机制依据;按上述固定版本族阅读。
- 中文官方或作者资料:用于术语和讲解交叉核对,冲突以原始规范为准。
边界泄露与架构质量取舍
边界泄露反例
边界泄露反例是把数据库行对象直接交给调用方修改,调用方绕过预留接口把余量设成负数。返回不可变值或副本可缩小暴露面,但若内部仍保留外部传入的可变引用,也可能被旁路修改;所有权要双向检查。
架构质量属性取舍
架构质量属性取舍应给场景:新增一种库存存储要改几个模块,故障时哪些请求还能完成,延迟预算允许多少同步跳数。可修改性、可用性与安全并不自动同向改善,不能用“分层”二字替代可检验的目标。
架构原文与旧设计稿
架构原文与旧设计稿对照Parnas的KWIC案例,关注隐藏决策而非背诵层名。中文官方架构风格资料用于比较部署约束。IM、朋友圈与建群旧稿保留历史需求细节,不将其中临时权限或并发草案提升为当前项目事实。
可变引用怎样绕过边界
若查询返回内部库存对象,调用方可直接把 remaining 改成 -1,而预留接口从未执行。返回副本只解决输出侧共享;构造仓库时保存外部传入字典也会留下输入侧旁路。检查所有权时要追踪引用如何进入和离开,而不只看公开方法列表。
查看图表代码
来源与适用边界
- 英文官方、作者或规范原文:本专题机制依据;按上述固定版本族阅读。
- 中文官方或作者资料:用于术语和讲解交叉核对,冲突以原始规范为准。
- 相关既有参考:原URL与专业范围保留;历史案例不能自动代表当前实现。
继续阅读
- 库存边界实践
- 架构取舍与原文
- 架构取舍与原文