大数跨境
0
0

告别加班!用这份【架构设计模板】,3小时写完原本3天的架构文档!

告别加班!用这份【架构设计模板】,3小时写完原本3天的架构文档! 二进制跳动
2025-11-13
2
导读:告别加班!用这份【架构设计模板】,3小时写完原本3天的架构文档!
[需求介绍主要描述需求的背景、目标、范围等]

1. 项目背景与需求分析

业务背景

随着“星云严选”电商平台的业务版图不断扩张,为了支撑高并发与业务复杂性,我们将单体架构逐步拆分为微服务架构。目前,核心的“交易中心”与其他下游业务子系统之间仍采用**同步远程调用(RPC)的方式进行通信。

当前痛点这种强依赖的同步调用模式,在业务高峰期暴露出了以下三个核心架构瓶颈:

  • 响应延迟(性能瓶颈):目前用户完成一笔“下单”操作后,交易中心必须同步等待“库存中心”扣减、“风控中心”扫描、“积分中心”累积、物流中心”履约等 8 个子系统全部返回成功响应。这导致用户端的下单接口响应时间(RT)过长,严重影响购物体验。

  • 扩展受限(耦合瓶颈):系统间存在高度紧耦合。例如,运营团队计划新增一个“实时大屏统计子系统”来监控大促数据,这要求交易中心必须修改核心代码并开发新接口来主动调用该系统。每新增一个下游业务消费者,核心交易链路就必须跟随变更,违反了“开闭原则”。

  • 研发效能(效率瓶颈):由于下游各子系统的接口定义(参数结构、协议标准)存在细微差异,交易中心团队需要针对每个子系统进行定制化的接口适配与联调。这种点对点的网状集成方式,导致开发与测试团队陷入了大量的重复性劳动,交付效率低下。


2. 需求分析

[需求分析主要全方位地描述需求相关的信息]

自研分布式消息中间件需求分析报告


1. 5W 维度分析


  • 👥 Who (利益干系人/用户角色)

    • 构建者: 基础架构研发团队(负责中间件的设计、开发与运维)。

    • 使用者: 业务线研发团队(如交易中心、营销中心等,作为消息的生产者和消费者)。

    • 赞助者: CTO 及技术委员会(关注技术战略落地与成本控制)。

  • ⏰ When (触发时机/生命周期)

    • 运行时: 当上游业务系统需要解耦非核心逻辑、进行流量削峰填谷,或实现跨系统数据最终一致性时触发使用。

    • 项目节点: 需配合 Q3 季度的大型营销活动上线,作为底层支撑组件。

  • 📦 What (产出物/交付成果)

    • 核心服务端: 高可用、分布式的消息代理集群(Broker)。

    • 客户端 SDK: 提供标准的 Java 客户端开发包,封装网络通信与序列化细节。

    • 管理控制台: 用于Topic管理、消息轨迹追踪和集群监控的 Web 平台。

  • 🌍 Where (应用场景/部署环境)

    • 物理环境: 覆盖开发(Dev)、测试(Test)、预发布(Staging)及生产(Prod)全套环境。

    • 网络环境: 仅限公司私有云内网(Intranet)部署,不暴露公网入口。

  • 🎯 Why (核心驱动力/价值主张)

    • 架构升级: 打破服务间的同步调用链,消除强耦合,降低系统雪崩风险。

    • 提升吞吐: 通过异步化处理,显著降低核心链路的响应时间(RT),提升用户体验。



2. 1H 关键业务流程


本系统核心遵循 发布/订阅 (Publish/Subscribe) 模型,包含两个最基础的原子流程:

  1. 消息投递 (Publish):

    • 上游业务系统(Producer)将业务数据(如“订单已创建”)封装为标准消息体。

    • Producer 通过 SDK 与负载均衡策略,将消息发送至服务端(Broker)。

    • Broker 接收并持久化存储成功后,返回 ACK 确认。

  2. 消息消费 (Subscribe):

    • 下游业务系统(Consumer)启动时向 Broker 订阅感兴趣的话题(Topic)。

    • Consumer 从 Broker 拉取(Pull)或被推送(Push)消息。

    • 业务逻辑处理完成后,Consumer 向 Broker 反馈消费成功状态,Broker 更新消费进度(Offset)。



3. 8C 约束与限制 (Constraints & Limitations)


基于当前资源与业务现状,项目组需严格遵守以下非功能性需求(NFR):

维度 约束详情 设计考量与调整空间
⚡ 性能 (Performance) 对标 Kafka:
 单机吞吐量需支撑 $100,000+$ TPS,端到端延迟控制在毫秒级。
核心指标,不可妥协。需重点优化 I/O 模型。
💰 成本 (Cost) TCO 控制:
 初期集群规模严格控制在 10 个计算节点(VM/容器)以内。
需采用轻量级架构,避免依赖过重的外部组件(如 ZooKeeper 等,可视情况自研元数据管理)。
⏳ 时间 (Time) MVP 交付:
 项目周期 3 个月。需完成核心功能并在 2 个非核心业务线试运行。
时间紧迫,可适当裁剪高级功能(如事务消息、延时消息)在二期迭代。
🛡️ 可靠性 (Reliability) SLA 标准:
 服务可用性承诺 $\ge 99.99\%$,数据可靠性承诺不丢消息。
需设计主从复制或多副本机制,确保 Leader 宕机后可快速选举。
🔒 安全性 (Security) 内网信任:
 仅限内网传输。不涉及传输层加密(TLS)及内容加密。
敏感数据由业务方自行加密。重点在于网络隔离与基本的 ACL 鉴权。
⚖️ 合规性 (Compliance) 研发规范:
 必须接入公司现有的 DevOps 流水线,遵循代码规范与日志标准。
必须满足,便于后续自动化运维与审计。
🛠️ 技术性 (Technology) 技术栈统一:
 核心语言锁定 Java
团队 Java 储备丰富,便于维护和排查问题。避免引入 Go/C++ 等异构语言增加维护成本。
🔌 兼容性 (Compatibility) Greenfield 项目:
 无历史遗留包袱,无需兼容旧版协议。
设计可更具前瞻性,无需为适配老系统妥协架构。

3. 复杂度分析

[分析需求的复杂度,复杂度常见的有高可用、高性能、可扩展等]

3.1 高可用性分级与策略


系统容灾等级的设定遵循“木桶效应”原则,即必须满足对稳定性要求最严苛的业务链路。基于对下游业务影响面的分析,我们得出以下结论:

  • 一级风险管控(合规性红线):以内容审核子系统为代表,该链路对消息丢失持有“零容忍”态度。一旦审核消息丢失导致违规内容发布,将直接触犯法律法规,引发严重的监管风险。


  • 二级风险管控(资产与体验):以“等级与奖励子系统”为代表,该链路涉及用户核心资产。虽然其故障后果主要体现为用户投诉与收入流失,严重程度略低于法律合规风险,但仍属于核心业务范畴。


🔴 架构决策:综合考虑,系统必须对标一级风险管控标准,构建全链路高可用架构。这意味着从消息接收(写入)、持久化存储、到消息分发读取)的每一个环节,都必须具备冗余容灾能力,确保数据不丢失、服务不中断。

3.2 性能估算与容量规划


基于现有业务规模,结合互联网流量的潮汐特性与未来增长预期,我们采用峰值倍率法进行容量测算。

1. 基础流量模型

  • 写入量基准: 参考前浪微博目前的业务量级,每日产生的微博发布(写入)消息约为 1000 万条

  • 读写放大比: 平均每条消息需分发给 10 个下游子系统处理,因此每日的消息读取量约为 1 亿次

2. 负载推演逻辑

  • 平均负载: 若将全天流量平摊到每一秒,平均每秒的写入量(TPS)约为 115 次,读取量(QPS)约为 1150 次。

  • 峰值负载(3倍): 考虑到用户活跃时间的集中性(如晚高峰、热点事件),系统设计不能仅参考平均值。按照通用的 3 倍峰值系数计算,峰值 TPS 约为 345,峰值 QPS 约为 3450。

  • 系统设计目标(4倍冗余): 鉴于当前业务基数较低,且需预留空间应对未来的业务爆发,我们在峰值负载的基础上,进一步预留 4 倍的性能余量作为最终设计目标。

3. 最终性能指标 (SLA)基于上述推演,消息队列系统的最终交付标准确定为:

  • 写入性能目标 (TPS):1,380 (次/秒)

  • 读取性能目标 (QPS):13,800 (次/秒)


💡 复杂度评估:分析表明,TPS 1380 对主流中间件而言压力较小;但 QPS 13800 已达到较高的并发水位。“高读写比”是本系统的显著特征,因此,如何保证高并发下的读取效率(如优化缓存命中率、减少IO开销)将是架构设计的核心挑战。

可扩展

消息队列的功能很明确,基本无须扩展,因此可扩展性不是这个消息队列的关键复杂度。

4. 备选方案

针对前述的高可用与高性能需求,项目组初步制定了三套架构演进方向,具体如下:

备选方案一:成熟开源组件引入(基于 Kafka)


  • 方案定义: 直接引入业界成熟的开源消息中间件 Kafka,进行适配性封装。

  • 核心特征: 站在巨人的肩膀上。利用 Kafka 极高的吞吐量和完善的生态,快速满足性能需求,尽量减少重复造轮子。

  • [此处省略具体实施细节...]


📋 备选方案二:自研代理层 + 通用存储(Cluster + MySQL)


  • 方案定义: 采用“计算与存储分离”架构。自研基于 Java 的消息代理集群(Broker)负责协议解析与流量分发,底层采用公司技术栈最成熟的 MySQL 作为持久化存储引擎。

  • 核心特征: 架构可控性强,且极大降低了存储层的开发复杂度与运维门槛(直接复用现有的 DBA 运维能力)。

  • [此处省略具体实施细节...]


📋 备选方案三:完全自研分布式架构(Cluster + 自研文件存储)


  • 方案定义: 深度自研方案。参考 Kafka 的日志存储模型,使用 Java 编写应用层,并直接针对文件系统(File System)开发专用的消息存储引擎,绕过通用数据库。

  • 核心特征: 追求极致性能与完全自主可控,旨在从底层 I/O 层面进行针对性优化。

  • [此处省略具体实施细节...]


------架构设计模板-----

[备选方案评估后会选择一个方案落地实施,架构设计文档就是用来详细描述细化方案的]


1. 总体方案

[总体方案需要从整体上描述方案的结构,其核心内容就是架构图,以及针对架构图的描述,包括模块或者子系统的职责描述、核心流程]

2. 架构总览[架构总览给出架构图以及架构的描述]

分布式分片与分组模型


  • 数据分散集群: 系统的存储层被逻辑划分为多个独立的数据分组。每个分组承载并存储全部消息数据的一个子集。

  • 分组隔离性: 分组之间的数据存储和操作是完全独立的,数据不进行跨组同步。这种 Shared-Nothing 架构有助于系统的横向扩展(Scale-Out)能力和隔离故障。

  • 存储结构: 每个数据分组是自包含的,由一对主/备 MySQL 实例构成,专门用于该分组的消息持久化存储。


高可用与读写分离策略


  • 数据冗余: 在同一数据分组内部,主(Primary)MySQL 与 备(Secondary)MySQL 之间配置了实时数据复制(Master-Slave Replication)。这确保了分组内数据的持久性和高可用性。

  • 正常运行状态:

    • 主节点: 同时承担该分组内的全部消息写入消息读取服务,保持读写活跃状态。

    • 备节点: 处于热备状态,不主动对外提供服务。

  • 故障转移策略(降级服务):

    • 主节点发生宕机或不可用时,备节点将立即被激活并接管,对外提供消息读取服务,确保服务连续性。

    • 注:消息写入服务的故障转移和数据恢复策略需另行设计(例如,需确保Primary宕机后的写入数据不会丢失)。


客户端负载均衡机制 (Client Load Balancing)


客户端(包含生产者 Producer 和消费者 Consumer)集成了内置的负载均衡逻辑:

  • 访问策略: 客户端采用**轮询(Round-Robin)**策略,将消息写入请求分散到不同的数据分组的主节点,同时将消息读取请求分散到所有可用的主节点(及故障时的备节点)。

  • 目标: 通过客户端级别的轮询机制,实现读写流量在整个分片集群中的均匀分布,避免出现热点分区,提升整体吞吐量。


3. 核心流程消息发送流程

[此处省略流程描述]

消息读取流程

[此处省略流程描述]

4. 详细设计

[详细设计需要描述具体的实现细节]

高可用设计

本消息队列系统的可靠性设计围绕消息发送、消息存储和消息读取三个核心环节展开,其特点是客户端多轮重试部分风险交由外部运维(DBA)或业务方承担

1. 消息发送可靠性 (Producer Reliability)

机制 描述 限制与责任归属
重试策略
客户端 SDK 支持多轮询重试,依次尝试所有分组的主服务器直到发送成功。
SDK 本地缓存不保证持久性。
 若业务服务器重启,未发送的缓存消息将永久丢失。业务方需自行实现关键消息的永久存储功能。
最终失败
若所有主服务器都失败,SDK 可配置选择缓存(Cache)或丢弃(Discard)消息。

2. 消息存储可靠性

机制 描述 限制与责任归属
高可用存储
每个分组采用 MySQL 主备复制,保障消息存储具备冗余能力。
不对复制延迟导致的数据丢失做系统设计。
 依赖外部 DBA 团队监控主备复制延迟(如超 30 秒)并进行人工处理和告警,以降低数据丢失风险。

3. 消息读取与服务高可用

机制 描述 限制与责任归属
主备模式
每个分组设有一台主服务器(支持读写)和一台备服务器(只支持读取)。备服务器作为热备。
依赖外部协调服务。
 主备角色切换及故障判断由 ZooKeeper 负责协调。
故障判断
主备服务器在 ZooKeeper 上创建短暂节点(EPHEMERAL Node),默认超时时间为 10 秒。备服务器通过监控主服务器节点状态,判断故障后接管读取服务。
故障判断时间受 ZooKeeper 节点超时时间限制。
高性能设计

[此处省略具体设计]

可扩展设计

[此处省略具体设计]

安全设计

消息队列系统将权限控制设计为两层防护机制,以确保系统安全和数据隔离。

1. 身份认证(Authentication)


  • 目标: 防止恶意或未经授权的系统接入。

  • 机制: 系统为接入的业务子系统分配唯一的身份标识(ID)接入密钥(Access Key)

  • 校验流程: SDK 必须在建立连接时进行身份校验。校验失败的连接将被服务器立即中断。


2. 队列权限控制(Authorization)


  • 目标: 实现对敏感队列的精细化访问控制(谁能发、谁能读)。

  • 机制: 队列的读写权限保存在配置文件中(基于身份标识)。

  • 执行流程: 消息队列服务器在处理发送或读取消息的请求时,会根据子系统的身份标识实时查询配置权限,拒绝任何未经授权的操作。


其他设计

[其他设计包括上述以外的其他设计考虑点,例如指定开发语言、符合公司的某些标准等,如果篇幅较长,也可以独立进行描述]

部署方案

服务器部署策略:资源共置 (Resource Co-location)


  • 部署方式: 采用混合部署策略。消息队列服务器(Broker)与其对应的 MySQL 数据库服务器将部署在同一台物理服务器上。

  • 部署映射:

    • 主节点组: 同一分组的主服务器(MQ Broker)与主 MySQL 实例部署在同一物理节点。

    • 备节点组:备服务器(MQ Broker)与备 MySQL 实例部署在另一物理节点。

  • 设计依据:

    • 资源互补: 消息队列服务器的核心压力在计算资源(CPU 密集型);而 MySQL 数据库的核心压力在磁盘 I/O 资源(I/O 密集型)

    • 效益: 这种互补性部署有助于最大化利用单台服务器的资源,理论上互相影响的几率较低。


硬件与环境要求 (Hardware Specification)

为满足系统的高性能和低延迟要求,对基础硬件进行如下规范:

  • 服务器类型: 必须采用物理服务器(Bare-Metal Servers)部署,不使用虚拟化环境。

  • 硬件规格要求:

    • CPU: 32 核心 (Cores)

    • 内存: 48 GB RAM

    • 存储: 512 GB SSD 硬盘 (必须是高性能固态硬盘)

  • 选型依据:

    • 性能要求: 核心业务对性能要求极高,选用物理服务器可以避免虚拟化带来的性能损耗和资源竞争。

    • 动态扩容需求: 考虑到消息队列系统的动态缩扩容频率预计不高,使用物理机在性能上更具优势和稳定性。


5. 架构演进规划

[通常情况下,规划和设计的需求比较完善,但如果一次性全部做完,项目周期可能会很长,因此可以采取分阶段实施,即:第一期做什么、第二期做什么,以此类推]

整个消息队列系统分三期实现:

第一期:实现消息发送、权限控制功能,预计时间 3 个月。

第二期:实现消息读取功能,预计时间 1 个月。

第三期:实现主备基于 ZooKeeper 切换的功能,预计时间 2 周。


【声明】内容源于网络
0
0
二进制跳动
15 年 + 技术老兵 架构师|技术总监|科技创业技术合伙人 曾任职苏宁科技、电讯盈科、联想云 专注架构设计与技术落地
内容 739
粉丝 0
二进制跳动 15 年 + 技术老兵 架构师|技术总监|科技创业技术合伙人 曾任职苏宁科技、电讯盈科、联想云 专注架构设计与技术落地
总阅读5
粉丝0
内容739