菜单

设计方法论

相关源文件

目的与范围

本文档详细介绍了构建复杂后端系统常用的设计方法论,包括领域驱动设计(DDD)、Actor 模型、响应式编程以及其他相关方法。这些方法论为设计可维护、可扩展并符合业务需求的系统提供了系统化的框架。有关具体设计模式的信息,请参阅设计模式,分布式系统设计原则请参考分布式系统设计

设计方法论概述

设计方法论为系统架构提供了结构化的方法,有助于弥合业务需求与技术实现之间的差距。每种方法论都有其自身的侧重点、优势和适用场景。

来源:README.md:297-308

领域驱动设计(DDD)

领域驱动设计是一种专注于理解和建模业务领域的方法论,旨在创建能够准确反映业务需求的软件。DDD通过共享语言和概念模型,弥合了领域专家和开发人员之间的沟通鸿沟。

DDD核心概念

来源:README.md:298-300

DDD构建块

组件描述用途
实体具有独特标识的对象客户、订单、产品
值对象没有标识的不可变对象地址、金额、日期范围
聚合具有边界的实体和值对象集群订单(包含订单行)
仓库为聚合提供存储和检索OrderRepository, CustomerRepository
服务包含不适合放入实体的业务逻辑PaymentService, ShippingService
工厂创建复杂对象OrderFactory, ReportFactory
限界上下文定义模型适用的边界电子商务上下文,物流上下文

来源:README.md:298-300

命令查询职责分离(CQRS)

CQRS 是一种模式,将读写操作分离到不同的模型中,从而针对各自的特定目的进行优化。

来源:README.md:299

充血模型 vs. 贫血模型

DDD 通常提倡充血领域模型,其中业务逻辑封装在领域对象中,而不是贫血模型中,其中对象仅是数据容器。

充血领域模型贫血领域模型
业务逻辑在领域对象中业务逻辑在服务中
对象强制执行不变性对象是数据结构
行为和数据在一起行为和数据分离
更高的面向对象内聚性披着面向对象外衣的程序式风格
更符合DDD原则不太符合DDD原则

来源:README.md:300

Actor模型

Actor模型是一个并发计算的概念框架,将“actor”视为计算的通用原语。每个actor都可以做出本地决策、创建更多actor、发送消息并确定如何响应收到的下一条消息。

来源:README.md:301

Actor模型的主要特点

  1. 隔离状态:每个actor的状态都是隔离的,只能由其自身行为修改
  2. 消息驱动:所有通信都通过异步消息传递发生
  3. 轻量级:Actor被设计为轻量级,能够创建数百万个actor
  4. 位置透明性:Actor无论位于何处(同一进程、不同进程、不同机器)都可以通信

Actor模型实现

实现语言/平台显著特点
AkkaScala, Java完整的actor框架、集群、持久化
Erlang/OTPErlang内置语言支持actor(“进程”)
Orleans.NET虚拟actor模型,专为分布式系统设计
PonyPony语言类型系统保证无数据竞争

来源:README.md:301

响应式编程

响应式编程是一种专注于数据流和变化传播的编程范式,它允许构建非阻塞、事件驱动的应用程序,从而以更少的线程实现更好的扩展性。

来源:README.md:302-305

响应式宣言原则

响应式宣言定义了响应式系统的四个关键原则

  1. 响应迅速:系统能够及时响应
  2. 弹性:系统在面对故障时保持响应
  3. 伸缩性:系统在不同负载下保持响应
  4. 消息驱动:系统依赖异步消息传递

响应式编程实现

库/框架平台主要功能
ReactorJava非阻塞响应式流,被Spring WebFlux使用
RxJavaJavaJVM的响应式扩展,可组合异步事件
Project ReactorJava响应式流实现
Vert.xJava事件驱动、非阻塞工具包
Akka StreamsScala/Java响应式流规范的实现

来源:README.md:303-305

事件驱动架构

事件驱动架构(EDA)是一种设计范式,程序流程由事件(如用户操作、传感器输出或其他程序的消息)决定。

来源:README.md:148-156

事件驱动架构模式

模式描述用例
事件通知信息最简单的事件状态更新、通知
事件携带状态传输事件包含所需的状态信息数据同步
事件溯源事件作为真相来源,存储所有变更审计、复杂状态重建
CQRS分离读写操作性能优化、复杂领域

来源:README.md:299

无服务器架构

无服务器架构是一种设计模式,应用程序由第三方服务托管,开发者无需管理服务器软件和硬件。

来源:README.md:307

主要优点和挑战

优点挑战
无需服务器管理冷启动延迟
自动伸缩执行时长有限
按使用量付费厂商锁定
降低运营成本调试复杂
专注于代码,而非基础设施本地测试受限
更快的上市时间无状态要求

来源:README.md:307

服务网格

服务网格是微服务架构中处理服务间通信的专用基础设施层,提供流量管理、安全性、可观察性等功能。

来源:README.md:308

主要服务网格实现

实现主要功能
Istio流量管理、安全性、策略执行、遥测
Linkerd超轻量、注重安全、开销极小
Consul Connect服务发现、配置、分段
AWS App MeshAWS原生服务网格,集成ECS/EKS

来源:README.md:308

与开发方法论的关系

设计方法论与开发方法论相辅相成,两者在实践中相互影响。

来源:README.md:309-321

集成矩阵

设计方法论兼容的开发方法论关键集成点
领域驱动设计敏捷、SCRUM、XP迭代领域建模,领域专家参与
Actor模型敏捷、TDD测试actor交互,增量式actor开发
响应式编程TDD、结对编程流测试策略,协作式事件流设计
事件驱动架构SCRUM、看板冲刺规划中的事件风暴,事件流可视化
无服务器敏捷、DevOps函数的CI/CD,自动化测试
服务网格DevOps、看板基础设施即代码,可观察性

来源:README.md:309-321

总结与选择指南

选择正确的设计方法论取决于多种因素,包括问题领域、团队专业知识、组织背景和技术要求。

方法论何时使用何时避免
DDD复杂领域,长期运行系统简单的CRUD应用,时间紧迫
Actor模型高并发,弹性系统顺序处理,简单领域
响应式编程I/O密集型系统,事件处理CPU密集型计算,简单工作流
事件驱动解耦系统,异步处理强一致性要求,简单流程
无服务器可变工作负载,初创公司,MVP可预测的高负载,长时间运行进程
服务网格大型微服务部署小型应用,单体应用,简单部署

来源:README.md:297-308