架构决策记录(ADR)
概述
架构决策记录(Architecture Decision Records, ADR)是记录重要架构决策的文档,用于捕获决策背景、决策内容、决策后果等信息。本文档记录了井云服务中心后端系统的关键架构决策。
非常推荐:记录"为什么当初这么选",避免几年后重复争论。
ADR 格式规范
ADR 结构
每个 ADR 包含以下部分:
- ADR 编号:唯一标识符
- 标题:简短描述决策内容
- 状态:提议中/已接受/已弃用/已替代
- 背景:决策背景和上下文
- 决策:具体的决策内容
- 后果:决策带来的影响
- 实施:实施细节和进度
- 相关 ADR:相关的其他决策记录
ADR 状态定义
- 提议中(Proposed):决策正在讨论中
- 已接受(Accepted):决策已确定并开始实施
- 已弃用(Deprecated):决策不再推荐但仍在使用
- 已替代(Superseded):决策已被新决策替代
架构决策记录
ADR-001: 选择 Go + Kratos 微服务架构
状态:已接受
背景:
- 项目需要构建一个可扩展、高性能的后端系统
- 团队具备 Go 语言开发经验
- 需要支持多租户和微服务架构
- 要求系统具备良好的可观测性和运维能力
决策:
- 采用 Go 语言作为主要开发语言
- 使用 Kratos v2 框架构建微服务架构
- 采用 gRPC + HTTP 双协议支持
- 使用 Protobuf 定义 API 接口
后果: 正面影响:
- Go 语言提供优秀的并发性能
- Kratos 框架提供完整的微服务工具链
- gRPC 提供高性能的服务间通信
- Protobuf 确保接口的类型安全和版本兼容性
负面影响:
- 团队需要学习 Kratos 框架
- gRPC 调试相对复杂
- Protobuf 增加了开发复杂度
实施:
- ✅ 完成:框架选型和技术验证
- ✅ 完成:团队培训和技术调研
- ✅ 完成:基础服务框架搭建
- 🔄 进行中:服务逐步迁移到新架构
相关 ADR:
- ADR-002: 数据库选型
- ADR-003: 服务发现和配置管理
ADR-002: 选择 PostgreSQL 作为主数据库
状态:已接受
背景:
- 需要一个支持 ACID 事务的关系型数据库
- 需要支持 JSON 字段存储灵活配置
- 要求良好的并发性能和扩展性
- 需要支持复杂查询和数据分析
决策:
- 选择 PostgreSQL 17.5 作为主数据库
- 使用 Ent ORM 进行数据库操作
- 采用主从复制提高可用性
- 使用连接池管理数据库连接
后果: 正面影响:
- PostgreSQL 提供强大的关系型数据库功能
- JSON 支持灵活的配置存储
- Ent ORM 提供类型安全的数据库操作
- 主从复制提供高可用性
负面影响:
- PostgreSQL 相比 MySQL 学习成本更高
- Ent ORM 有一定的性能开销
- 需要额外的数据库维护工作
实施:
- ✅ 完成:数据库环境搭建
- ✅ 完成:数据模型设计和实现
- ✅ 完成:主从复制配置
- ✅ 完成:备份和恢复策略
相关 ADR:
- ADR-001: 微服务架构选型
- ADR-004: 缓存策略
ADR-003: 使用 Consul 进行服务发现和配置管理
状态:已接受
背景:
- 微服务架构需要服务注册和发现机制
- 需要统一的配置管理方案
- 要求支持动态配置更新
- 需要服务健康检查功能
决策:
- 使用 Consul 作为服务注册中心
- 使用 Consul KV 存储配置信息
- 实现配置热更新机制
- 集成健康检查和服务发现
后果: 正面影响:
- Consul 提供完整的服务治理功能
- 支持动态配置更新
- 提供服务健康检查
- 支持多数据中心部署
负面影响:
- 增加了系统复杂度
- Consul 集群需要额外维护
- 网络分区时可能影响服务发现
实施:
- ✅ 完成:Consul 集群部署
- ✅ 完成:服务注册和发现集成
- ✅ 完成:配置管理实现
- ✅ 完成:健康检查配置
相关 ADR:
- ADR-001: 微服务架构选型
- ADR-005: 消息队列选型
ADR-004: 采用 Redis 作为缓存和会话存储
状态:已接受
背景:
- 需要高性能的缓存解决方案
- 需要分布式会话存储
- 要求支持多种数据结构
- 需要高可用性和持久化
决策:
- 使用 Redis 作为主要缓存
- 使用 Redis 存储用户会话
- 采用 Redis 集群提高可用性
- 实现多级缓存策略
后果: 正面影响:
- Redis 提供优秀的缓存性能
- 支持丰富的数据结构
- 集群模式提供高可用性
- 减少数据库压力
负面影响:
- 增加了系统复杂度
- 缓存一致性问题
- 内存成本较高
- 需要额外的运维工作
实施:
- ✅ 完成:Redis 集群部署
- ✅ 完成:缓存策略实现
- ✅ 完成:会话存储集成
- 🔄 进行中:缓存优化和监控
相关 ADR:
- ADR-002: 数据库选型
- ADR-006: 消息队列选型
ADR-005: 选择 RabbitMQ 作为消息队列
状态:已接受
背景:
- 微服务间需要异步通信机制
- 需要可靠的消息传递保证
- 要求支持消息持久化
- 需要良好的管理界面和监控
决策:
- 使用 RabbitMQ 作为消息队列
- 采用镜像队列提高可用性
- 实现消息持久化和重试机制
- 集成监控和管理界面
后果: 正面影响:
- RabbitMQ 提供成熟的消息队列功能
- 支持多种消息模式
- 提供管理界面便于运维
- 支持消息持久化和重试
负面影响:
- 增加了系统复杂度
- 消息延迟可能影响实时性
- 需要额外的集群维护
- 消息顺序保证复杂
实施:
- ✅ 完成:RabbitMQ 集群部署
- ✅ 完成:消息队列集成
- ✅ 完成:持久化和重试机制
- ✅ 完成:监控和管理界面
相关 ADR:
- ADR-003: 服务发现和配置管理
- ADR-004: 缓存策略
ADR-006: 采用 JWT 进行身份认证
状态:已接受
背景:
- 需要无状态的身份认证方案
- 支持微服务间的认证传递
- 要求良好的安全性和性能
- 需要支持多种登录方式
决策:
- 使用 JWT Token 进行身份认证
- 实现访问令牌和刷新令牌机制
- 支持多种第三方登录
- 实现令牌黑名单机制
后果: 正面影响:
- JWT 支持无状态认证