
以类微博功能的消息队列为例,给出架构设计中最重要的两个文档的模板和关键说明。这个案例文档仅给出一些关键内容供参考,部分细节无法全面覆盖或者完全保证正确。
备选方案模板 需求介绍需求介绍主要描述需求的背景、目标、范围等
随着业务的不断发展,业务上拆分的子系统越来越多,目前系统间的调用都是同步调用,由此带来几个明显的系统问题:
基于以上背景,我们需要引入消息队列进行系统解耦,将目前的同步调用改为异步通知。
需求分析需求分析主要全方位地描述需求相关的信息
5W5W 指 Who、When、What、Why、Where。
消息队列的 5W 分析如下:
Who:消息队列系统主要是业务子系统来使用,子系统发送消息或者接收消息。
When:当子系统需要发送异步通知的时候,需要使用消息队列系统。
What:需要开发消息队列系统。
Where:开发环境、测试环境、生产环境都需要部署。
Why:消息队列系统将子系统解耦,将同步调用改为异步通知。
这里的 How 不是设计方案也不是架构方案,而是关键业务流程。消息队列系统这部分内容很简单,但有的业务系统 1H 就是具体的用例了,有兴趣的同学可以尝试写写 ATM 机取款的业务流程。如果是复杂的业务系统,这部分也可以独立成用例文档
消息队列有两大核心功能:
8C 指的是 8 个约束和限制即 Constraints,包括性能(Performance)、成本(Cost)、时间(Time)、可靠性(Reliability)、安全性(Security)、合规性(Compliance)、技术性(Technology)、兼容性(Compatibility)
需求中涉及的性能、成本、可靠性等仅仅是利益关联方提出的诉求,不一定准确;如果经过分析有的约束没有必要,或成本太高、难度太大,这些约束是可以调整的。
消息对列的约束限制如下:
复杂度分析实际操作的时候每个约束和限制都要有详细的逻辑推导,避免完全拍脑袋式决策
分析需求的复杂度,复杂度常见的有高可用、高性能、可扩展等
识别复杂度
高可用对于微博子系统来说,如果消息丢了,导致没有审核,然后触犯了国家法律法规,则是非常严重的事情;对于等级子系统来说,如果用户达到相应等级后,系统没有给他奖品和专属服务,则 VIP 用户会很不满意,导致用户流失从而损失收入,虽然也比较关键,但没有审核子系统丢消息那么严重。
综合来看,消息队列需要高可用性,包括消息写入、消息存储、消息读取都需要保证高可用性。
高性能用户每天发送 1000 万条消息,那么微博子系统一天会产生 1000 万条消息,平均一条消息有 10 个子系统读取,那么其他子系统读取的消息大约是 1 亿次。
将数据按照秒来计算,一天内平均每秒写入消息数为 115 条,每秒读取的消息数是 1150 条;
再考虑系统的读写并不是完全平均的,设计的目标应该以峰值来计算。
峰值一般取平均值的 3 倍,那么消息队列系统的 TPS 是 345,QPS 是 3450。
考虑一定的性能余量,由于现在的基数较低,为了预留一定的系统容量应对后续业务的发展,我们将设计目标设定为峰值的 4 倍,因此最终的性能要求是:TPS 为 1380,QPS 为 13800。
TPS 为 1380 并不高,但 QPS 为 13800 已经比较高了,因此高性能读取是复杂度之一。
消息队列的功能很明确,基本无须扩展,因此可扩展性不是这个消息队列的关键复杂度。
备选方案备选方案设计,至少 3 个备选方案,每个备选方案需要描述关键的实现,无须描述具体的实现细节。
备选方案 1:直接引入开源 Kafka
此处省略方案描述
备选方案 2:集群 + MySQL 存储
此处省略方案描述
备选方案 3:集群 + 自研存储
此处省略方案描述
备选方案 360 度环评。注意备选方案评估的内容会根据评估会议的结果进行修改,也就是说架构师首先给出自己的备选方案评估,然后举行备选方案评估会议,再根据会议结论修改备选方案文档。
备选方案及评估
架构设计模板备选方案评估后会选择一个方案落地实施,架构设计文档就是用来详细描述细化方案的
总体方案总体方案需要从整体上描述方案的结构,其核心内容就是架构图,以及针对架构图的描述,包括模块或者子系统的职责描述、核心流程。
架构总览架构总览给出架构图以及架构的描述
核心流程消息发送流程
此处省略流程描述
消息读取流程
此处省略流程描述
详细设计需要描述具体的实现细节
高可用设计消息发送可靠性
此处省略具体设计内容
消息存储可靠性
此处省略具体设计内容
消息读取可靠性
此处省略具体设计内容
此处省略具体设计
可扩展设计此处省略具体设计
安全设计如果方案不涉及,可以简单写上“无”,表示设计者有考虑但不需要设计;否则如果完全不写的话,方案评审的时候可能会被认为是遗漏了设计点
消息队列系统需要提供权限控制功能,权限控制包括两部分:身份识别和队列权限控制。
身份识别
省略具体内容
队列权限
省略具体内容
其他设计包括上述以外的其他设计考虑点,例如指定开发语言、符合公司的某些标准等,如果篇幅较长,也可以独立进行描述。例如:
部署方案主要包括硬件要求、服务器部署方式、组网方式等。例如:
消息队列系统的服务器和数据库服务器采取混布的方式部署,即:一台服务器上,部署同一分组的主服务器和主 MySQL,或者备服务器和备 MySQL。因为消息队列服务器主要是 CPU 密集型,而 MySQL 是磁盘密集型的,所以两者混布互相影响的几率不大。
硬件的基本要求:32 核 48G 内存 512G SSD 硬盘,考虑到消息队列系统动态扩容的需求不高,且对性能要求较高,因此需要使用物理服务器,不采用虚拟机。
架构演进规划通常情况下,规划和设计的需求比较完善,但如果一次性全部做完,项目周期可能会很长,因此可以采取分阶段实施,即:第一期做什么、第二期做什么,以此类推。例如:
整个消息队列系统分三期实现:
第一期:实现消息发送、权限控制功能,预计时间 3 个月。
第二期:实现消息读取功能,预计时间 1 个月。
第三期:实现主备基于 ZooKeeper 切换的功能,预计时间 2 周。
--------来源《极客课程》∙ 学习摘要