<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 架构师小白</title>
    <description>The latest articles on DEV Community by 架构师小白 (@tianxin).</description>
    <link>https://dev.to/tianxin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3824850%2Fd2237655-84d6-4050-ade4-4acffe96bf30.png</url>
      <title>DEV Community: 架构师小白</title>
      <link>https://dev.to/tianxin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tianxin"/>
    <language>en</language>
    <item>
      <title>云原生架构设计指南：构建现代化、可扩展的系统</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Sun, 05 Apr 2026 01:04:03 +0000</pubDate>
      <link>https://dev.to/tianxin/yun-yuan-sheng-jia-gou-she-ji-zhi-nan-gou-jian-xian-dai-hua-ke-kuo-zhan-de-xi-tong-2nca</link>
      <guid>https://dev.to/tianxin/yun-yuan-sheng-jia-gou-she-ji-zhi-nan-gou-jian-xian-dai-hua-ke-kuo-zhan-de-xi-tong-2nca</guid>
      <description>&lt;p&gt;云原生已经成为现代软件架构的主流范式。本文将深入探讨云原生架构的核心概念、设计原则和最佳实践。&lt;/p&gt;

&lt;h2&gt;
  
  
  什么是云原生？
&lt;/h2&gt;

&lt;p&gt;云原生（Cloud Native）是一种构建和运行应用程序的方法论，它充分利用云计算模型的优势。云原生应用专门为云端环境设计，能够充分利用云的弹性、分布式和自动化特性。&lt;/p&gt;

&lt;h2&gt;
  
  
  云原生的核心特征
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 容器化（Containerization）
&lt;/h3&gt;

&lt;p&gt;容器是云原生的基础构建块。每个应用及其所有依赖项都被打包成一个独立的容器镜像，确保在任何环境中都能一致运行。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:20-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci &lt;span class="nt"&gt;--only&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /app/node_modules ./node_modules&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "index.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 微服务架构（Microservices）
&lt;/h3&gt;

&lt;p&gt;将大型应用拆分为小型、独立部署的服务，每个服务负责特定的业务功能。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;微服务设计原则：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;单一职责：每个服务只做一件事&lt;/li&gt;
&lt;li&gt;自治性：服务可以独立开发、部署和扩展&lt;/li&gt;
&lt;li&gt;轻量级通信：服务间通过API进行通信&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 声明式基础设施（Declarative Infrastructure）
&lt;/h3&gt;

&lt;p&gt;使用配置文件定义期望的基础设施状态，而不是编写脚本来逐步配置。&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 不可变基础设施（Immutable Infrastructure）
&lt;/h3&gt;

&lt;p&gt;一旦创建，基础设施就不会被修改。如需变更，销毁旧实例并创建新实例。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. 自动化运维（Automated Operations）
&lt;/h3&gt;

&lt;p&gt;包括自动扩缩容、自动恢复、持续部署等。&lt;/p&gt;

&lt;h2&gt;
  
  
  云原生架构设计原则
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 十二要素应用（The Twelve-Factor App）
&lt;/h3&gt;

&lt;p&gt;Heroku提出的十二要素方法论是云原生架构的基石：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;要素&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;代码库&lt;/td&gt;
&lt;td&gt;单一代码库，多部署&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;依赖&lt;/td&gt;
&lt;td&gt;显式声明依赖&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;配置&lt;/td&gt;
&lt;td&gt;环境配置与代码分离&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;后端服务&lt;/td&gt;
&lt;td&gt;把后端服务当作附加资源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;构建/发布/运行&lt;/td&gt;
&lt;td&gt;严格分离构建和运行阶段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;进程&lt;/td&gt;
&lt;td&gt;无状态进程&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;端口绑定&lt;/td&gt;
&lt;td&gt;通过端口绑定导出服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;并发&lt;/td&gt;
&lt;td&gt;通过进程模型扩展&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;易处理&lt;/td&gt;
&lt;td&gt;快速启动/优雅终止&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开发/生产一致性&lt;/td&gt;
&lt;td&gt;保持开发/生产一致&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日志&lt;/td&gt;
&lt;td&gt;把日志当作事件流&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;管理进程&lt;/td&gt;
&lt;td&gt;后台管理任务作为一次性进程&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2. 弹性设计
&lt;/h3&gt;

&lt;p&gt;系统需要能够应对各种故障：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;超时设置&lt;/strong&gt;：为所有外部调用设置合理的超时&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;重试机制&lt;/strong&gt;：使用指数退避算法进行重试&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;熔断器&lt;/strong&gt;：防止级联故障&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;限流&lt;/strong&gt;：保护系统免受突发流量冲击&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 可观测性
&lt;/h3&gt;

&lt;p&gt;云原生系统必须是可观测的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;指标（Metrics）&lt;/strong&gt;：Prometheus+Grafana&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;日志（Logs）&lt;/strong&gt;：ELK/EFK Stack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;追踪（Traces）&lt;/strong&gt;：Jaeger/Zipkin&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 零信任安全
&lt;/h3&gt;

&lt;p&gt;不信任任何请求，默认验证一切：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mTLS服务间通信&lt;/li&gt;
&lt;li&gt;细粒度的访问控制&lt;/li&gt;
&lt;li&gt;加密所有流量&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  技术栈选型建议
&lt;/h2&gt;

&lt;h3&gt;
  
  
  容器编排
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes&lt;/strong&gt;：事实标准&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Swarm&lt;/strong&gt;：简单场景&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Helm&lt;/strong&gt;：Kubernetes包管理&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  服务网格
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Istio&lt;/strong&gt;：功能全面&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linkerd&lt;/strong&gt;：轻量级&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  监控体系
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prometheus&lt;/strong&gt;：指标收集&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grafana&lt;/strong&gt;：可视化&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loki&lt;/strong&gt;：日志聚合&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CI/CD
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ArgoCD&lt;/strong&gt;：GitOps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flux&lt;/strong&gt;：GitOps&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  实施路径
&lt;/h2&gt;

&lt;h3&gt;
  
  
  第一阶段：容器化
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;将应用容器化&lt;/li&gt;
&lt;li&gt;使用Docker Compose本地开发&lt;/li&gt;
&lt;li&gt;编写Dockerfile优化镜像大小&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  第二阶段：编排
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;部署到Kubernetes&lt;/li&gt;
&lt;li&gt;配置健康检查&lt;/li&gt;
&lt;li&gt;实现滚动更新&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  第三阶段：微服务拆分
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;识别服务边界&lt;/li&gt;
&lt;li&gt;逐步拆分单体应用&lt;/li&gt;
&lt;li&gt;建立服务间通信&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  第四阶段：云原生特性
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;实现自动扩缩容&lt;/li&gt;
&lt;li&gt;集成服务网格&lt;/li&gt;
&lt;li&gt;完善可观测性&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  第五阶段：安全强化
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;实施零信任网络&lt;/li&gt;
&lt;li&gt;配置RBAC&lt;/li&gt;
&lt;li&gt;启用mTLS&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  常见误区
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 过度工程
&lt;/h3&gt;

&lt;p&gt;不是所有应用都需要云原生。小型简单应用使用单体架构可能更合适。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 忽视运维复杂度
&lt;/h3&gt;

&lt;p&gt;云原生带来了灵活性，但也增加了运维复杂度。需要投资于运维团队的能力建设。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 一次性改造
&lt;/h3&gt;

&lt;p&gt;云原生转型应该是渐进式的，而不是一次性重写。&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 忽视成本
&lt;/h3&gt;

&lt;p&gt;云原生并不意味着节省成本。正确的架构设计才能带来成本效益。&lt;/p&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;云原生架构是现代软件开发的重要方向，它帮助我们构建更加灵活、可扩展、高可用的系统。但云原生也不是银弹，需要根据实际需求和团队能力来选择合适的方案。&lt;/p&gt;

&lt;p&gt;关键的成功因素包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;从小处着手，持续改进&lt;/li&gt;
&lt;li&gt;投资于自动化和可观测性&lt;/li&gt;
&lt;li&gt;培养DevOps文化&lt;/li&gt;
&lt;li&gt;渐进式而非革命性的转型&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;云原生不是终点，而是持续进化的起点。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;推荐阅读：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;《Cloud Native DevOps with Kubernetes》&lt;/li&gt;
&lt;li&gt;《The Twelve-Factor App》&lt;/li&gt;
&lt;li&gt;《Site Reliability Engineering》&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>cloudnative</category>
      <category>microservices</category>
      <category>devops</category>
    </item>
    <item>
      <title>熔断器模式：构建容错分布式系统的核心技术</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Sat, 04 Apr 2026 01:07:16 +0000</pubDate>
      <link>https://dev.to/tianxin/rong-duan-qi-mo-shi-gou-jian-rong-cuo-fen-bu-shi-xi-tong-de-he-xin-ji-zhu-3m9h</link>
      <guid>https://dev.to/tianxin/rong-duan-qi-mo-shi-gou-jian-rong-cuo-fen-bu-shi-xi-tong-de-he-xin-ji-zhu-3m9h</guid>
      <description>&lt;h1&gt;
  
  
  熔断器模式
&lt;/h1&gt;

&lt;p&gt;在分布式系统中，服务调用失败是不可避免的。熔断器模式（Circuit Breaker）是解决这一问题的关键技术。&lt;/p&gt;

&lt;h2&gt;
  
  
  什么是熔断器模式？
&lt;/h2&gt;

&lt;p&gt;熔断器模式源自电气工程中的保险丝概念。当某个服务持续出现故障时，熔断器会跳闸，阻止进一步请求，等待服务恢复。&lt;/p&gt;

&lt;h2&gt;
  
  
  三种状态
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;关闭状态（Closed）：正常，请求通过&lt;/li&gt;
&lt;li&gt;打开状态（Open）：熔断，快速失败
&lt;/li&gt;
&lt;li&gt;半开状态（Half-Open）：探测，允许有限请求&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  为什么需要熔断器？
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;防止级联故障：避免资源耗尽&lt;/li&gt;
&lt;li&gt;快速失败：改善用户体验&lt;/li&gt;
&lt;li&gt;服务恢复：给故障服务修复时间&lt;/li&gt;
&lt;li&gt;系统稳定：保护整个系统&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  代码实现
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CircuitBreaker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;failure_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recovery_timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;failure_threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;failure_threshold&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recovery_timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recovery_timeout&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;failure_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_failure_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CLOSED&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_should_attempt_reset&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HALF_OPEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;CircuitOpenError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Circuit is OPEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_on_success&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_on_failure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  电商案例
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;支付服务：失败时返回pending&lt;/li&gt;
&lt;li&gt;库存服务：快速响应不足&lt;/li&gt;
&lt;li&gt;通知服务：失败不影响主流程&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  最佳实践
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;合理设置阈值&lt;/li&gt;
&lt;li&gt;配置fallback降级方案&lt;/li&gt;
&lt;li&gt;渐进式恢复&lt;/li&gt;
&lt;li&gt;监控告警&lt;/li&gt;
&lt;li&gt;详细日志&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;熔断器模式是构建高可用系统的核心技术。&lt;/p&gt;

</description>
      <category>架构</category>
      <category>分布式系统</category>
      <category>微服务</category>
    </item>
    <item>
      <title>缓存架构深度指南：如何设计高性能缓存系统</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Thu, 02 Apr 2026 01:05:41 +0000</pubDate>
      <link>https://dev.to/tianxin/huan-cun-jia-gou-shen-du-zhi-nan-ru-he-she-ji-gao-xing-neng-huan-cun-xi-tong-36la</link>
      <guid>https://dev.to/tianxin/huan-cun-jia-gou-shen-du-zhi-nan-ru-he-she-ji-gao-xing-neng-huan-cun-xi-tong-36la</guid>
      <description>&lt;h1&gt;
  
  
  缓存架构深度指南：如何设计高性能缓存系统
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;在现代分布式系统中，缓存是提升系统性能的核心组件。本文将深入探讨缓存架构的设计原则、策略与实战技巧。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  为什么要使用缓存？
&lt;/h2&gt;

&lt;p&gt;在软件系统中，缓存的本质是&lt;strong&gt;用空间换时间&lt;/strong&gt;。通过将频繁访问的数据存储在高速存储介质中，减少对慢速数据源的访问次数，从而显著提升系统响应速度。&lt;/p&gt;

&lt;p&gt;典型场景：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;数据库查询结果缓存&lt;/li&gt;
&lt;li&gt;API响应缓存&lt;/li&gt;
&lt;li&gt;会话状态缓存&lt;/li&gt;
&lt;li&gt;计算结果缓存&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  缓存架构设计原则
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 缓存层级策略
&lt;/h3&gt;

&lt;p&gt;现代系统通常采用多级缓存架构：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────┐
│              CDN (边缘缓存)                  │
├─────────────────────────────────────────────┤
│           Redis/Memcached                   │
├─────────────────────────────────────────────┤
│              本地缓存                        │
├─────────────────────────────────────────────┤
│              数据库                         │
└─────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;原则&lt;/strong&gt;：数据越靠近CPU访问越快，但容量越小、成本越高。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 缓存失效策略
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cache-Aside（旁路缓存）&lt;/strong&gt;：最常用策略&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;读取：先查缓存，缓存miss再查数据库&lt;/li&gt;
&lt;li&gt;写入：先更新数据库，再删除缓存&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write-Through（写穿透）&lt;/strong&gt;：同步写入缓存和数据库&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write-Behind（写后置）&lt;/strong&gt;：异步写入，吞吐量高但有丢失风险&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 缓存一致性
&lt;/h3&gt;

&lt;p&gt;这是缓存最棘手的问题。推荐策略：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python 伪代码示例
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# 1. 先读缓存
&lt;/span&gt;    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. 缓存miss，读数据库
&lt;/span&gt;    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT * FROM users WHERE id = ?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 3. 写入缓存（设置合理过期时间）
&lt;/span&gt;    &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expire&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# 1. 先更新数据库
&lt;/span&gt;    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;UPDATE users SET ... WHERE id = ?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. 删除缓存（而非更新）
&lt;/span&gt;    &lt;span class="c1"&gt;# 删除比更新更安全，避免并发时脏数据
&lt;/span&gt;    &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. 缓存过期策略
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LRU（Least Recently Used）&lt;/strong&gt;：淘汰最久未使用的&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LFU（Least Frequently Used）&lt;/strong&gt;：淘汰访问频率最低的&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTL（Time To Live）&lt;/strong&gt;：基于过期时间&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Random&lt;/strong&gt;：随机淘汰&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. 缓存击穿、穿透与雪崩
&lt;/h3&gt;

&lt;p&gt;这是缓存系统的三大"杀手"：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;th&gt;解决方案&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;缓存击穿&lt;/td&gt;
&lt;td&gt;热点key过期，瞬间大量请求打到DB&lt;/td&gt;
&lt;td&gt;互斥锁 / 永不过期&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;缓存穿透&lt;/td&gt;
&lt;td&gt;查询不存在的数据，绕过缓存直达DB&lt;/td&gt;
&lt;td&gt;布隆过滤器 / 空值缓存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;缓存雪崩&lt;/td&gt;
&lt;td&gt;大量key同时过期&lt;/td&gt;
&lt;td&gt;随机TTL / 交叉过期&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  分布式缓存架构
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Redis 集群模式
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────┐     ┌─────────┐     ┌─────────┐
│  Redis  │────▶│  Redis  │────▶│  Redis  │  主节点
│ Master  │     │ Master  │     │ Master  │
└─────────┘     └─────────┘     └─────────┘
    │               │               │
┌─────────┐     ┌─────────┐     ┌─────────┐
│  Redis  │     │  Redis  │     │  Redis  │  从节点
│ Slave   │     │ Slave   │     │ Slave   │
└─────────┘     └─────────┘     └─────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  缓存分片策略
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;客户端分片&lt;/strong&gt;：应用层计算hash分布&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;代理分片&lt;/strong&gt;：Twemproxy、Codis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;服务端分片&lt;/strong&gt;：Redis Cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  实战：缓存设计最佳实践
&lt;/h2&gt;

&lt;h3&gt;
  
  
  缓存键设计
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 推荐格式
&lt;/span&gt;&lt;span class="n"&gt;cache_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:profile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;      &lt;span class="c1"&gt;# 明确命名空间
&lt;/span&gt;&lt;span class="n"&gt;cache_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product:list:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;category_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:page:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# 包含分页信息
&lt;/span&gt;&lt;span class="n"&gt;cache_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api:stats:daily:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;       &lt;span class="c1"&gt;# 包含时间维度
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  缓存监控指标
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hit Rate（命中率）&lt;/strong&gt;：&amp;gt; 90% 为理想&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Usage&lt;/strong&gt;：内存使用率&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eviction Count&lt;/strong&gt;：淘汰数量&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command Latency&lt;/strong&gt;：命令延迟&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection Count&lt;/strong&gt;：连接数&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  缓存配置建议
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Redis 配置示例&lt;/span&gt;
&lt;span class="na"&gt;maxmemory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2gb&lt;/span&gt;
&lt;span class="na"&gt;maxmemory-policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;allkeys-lru&lt;/span&gt;
&lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;300&lt;/span&gt;
&lt;span class="na"&gt;tcp-keepalive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;缓存架构设计是一个权衡的艺术：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;命中率是核心指标&lt;/strong&gt; — 持续监控优化&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;一致性是底线&lt;/strong&gt; — 根据业务选择合适策略&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;容量规划很重要&lt;/strong&gt; — 避免OOM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;监控告警不可少&lt;/strong&gt; — 及早发现问题&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;缓存不是万能的&lt;/strong&gt; — 适合读多写少场景&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;记住：&lt;strong&gt;缓存是用来用的，不是用来炫的&lt;/strong&gt;。过度缓存反而会增加系统复杂度。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;💬 你在项目中遇到过哪些缓存问题？欢迎在评论区分享交流！&lt;/p&gt;

&lt;h1&gt;
  
  
  软件架构 #缓存 #Redis #后端开发
&lt;/h1&gt;

</description>
      <category>软件架构</category>
      <category>缓存</category>
      <category>redis</category>
      <category>后端开发</category>
    </item>
    <item>
      <title>多智能体系统架构设计：从单体到群体智能的演进之路</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Tue, 31 Mar 2026 01:05:48 +0000</pubDate>
      <link>https://dev.to/tianxin/duo-zhi-neng-ti-xi-tong-jia-gou-she-ji-cong-dan-ti-dao-qun-ti-zhi-neng-de-yan-jin-zhi-lu-4il8</link>
      <guid>https://dev.to/tianxin/duo-zhi-neng-ti-xi-tong-jia-gou-she-ji-cong-dan-ti-dao-qun-ti-zhi-neng-de-yan-jin-zhi-lu-4il8</guid>
      <description>&lt;h1&gt;
  
  
  多智能体系统架构设计：从单体到群体智能的演进之路
&lt;/h1&gt;

&lt;h2&gt;
  
  
  引言
&lt;/h2&gt;

&lt;p&gt;当我们谈论现代软件架构时，AI Agent（智能体）已经成为了一个绕不开的话题。从 GitHub Trending 上，动辄上万星标的多智能体框架就可见一斑——TradingAgents、deer-flow、hermes-agent 等项目正引领着新一代架构设计的潮流。&lt;/p&gt;

&lt;p&gt;但今天我要聊的，不是具体某个框架的使用方法，而是&lt;strong&gt;多智能体系统（Multi-Agent System）的架构设计模式&lt;/strong&gt;。这是每一位想深入理解现代 AI 应用架构的开发者都必须掌握的核心知识。&lt;/p&gt;

&lt;h2&gt;
  
  
  什么是多智能体系统？
&lt;/h2&gt;

&lt;p&gt;想象一下软件开发团队的工作方式：产品经理负责需求分析，设计师负责界面方案，工程师负责代码实现，测试工程师负责质量保障——每个角色各司其职，又通过沟通协作完成复杂任务。&lt;/p&gt;

&lt;p&gt;多智能体系统的设计思想与此类似：&lt;strong&gt;让多个独立的 AI Agent 分别承担不同的角色和职责，通过协作完成单一 Agent 无法胜任的复杂任务&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;与单体 Agent（如单纯的 ChatGPT）相比，多智能体系统具有以下优势：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;单体 Agent&lt;/th&gt;
&lt;th&gt;多智能体系统&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;任务复杂度&lt;/td&gt;
&lt;td&gt;适合简单任务&lt;/td&gt;
&lt;td&gt;适合复杂任务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;专业分工&lt;/td&gt;
&lt;td&gt;全能但平庸&lt;/td&gt;
&lt;td&gt;专家协作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扩展性&lt;/td&gt;
&lt;td&gt;受限于单一模型能力&lt;/td&gt;
&lt;td&gt;可线性扩展&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;错误容忍&lt;/td&gt;
&lt;td&gt;单点故障&lt;/td&gt;
&lt;td&gt;互相兜底&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  多智能体系统的核心架构模式
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 层级式架构（Hierarchical Architecture）
&lt;/h3&gt;

&lt;p&gt;这是最常见的架构模式，类似于企业的组织结构。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：任务可以分解为明确的子任务，需要清晰的执行流程。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;代表项目&lt;/strong&gt;：deer-flow（字节跳动开源的长时域 SuperAgent）&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 联邦式架构（Federated Architecture）
&lt;/h3&gt;

&lt;p&gt;各 Agent 保持相对独立，通过共享的"黑板"（Blackboard）或消息队列进行协作。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：Agent 需要高度自治，任务边界模糊，协作模式动态变化。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;代表项目&lt;/strong&gt;：TradingAgents（多智能体金融交易框架）&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 辩论式架构（Debate Architecture）
&lt;/h3&gt;

&lt;p&gt;多个 Agent 对同一问题提出不同方案，通过"辩论"达成共识或选择最优解。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：需要多角度评估决策，避免单一视角的盲点。&lt;/p&gt;

&lt;h2&gt;
  
  
  通信协议：Agent 之间的"语言"
&lt;/h2&gt;

&lt;p&gt;多智能体系统的核心挑战之一是 Agent 之间的通信。以下是几种常见的通信模式：&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 结构化消息传递
&lt;/h3&gt;

&lt;p&gt;使用 JSON 或 Protocol Buffers 定义消息格式，确保类型安全。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 共享状态同步
&lt;/h3&gt;

&lt;p&gt;使用分布式存储（如 Redis）或向量数据库保持上下文一致。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 工具调用协议
&lt;/h3&gt;

&lt;p&gt;类似 MCP（Model Context Protocol），定义 Agent 如何调用其他 Agent 的能力。&lt;/p&gt;

&lt;h2&gt;
  
  
  实战：设计一个简单的多智能体系统
&lt;/h2&gt;

&lt;p&gt;让我们用 Python 实现一个简易的多智能体协作系统：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;abstractmethod&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;

    &lt;span class="nd"&gt;@abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SupervisorAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Supervisor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub_agents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub_agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# 分析任务，分配给合适的子 Agent
&lt;/span&gt;        &lt;span class="n"&gt;task_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub_agents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;can_handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task_type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no_agent_available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CodeAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code_generation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;def hello(): pass&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cannot_handle&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  架构设计的注意事项
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 避免循环依赖
&lt;/h3&gt;

&lt;p&gt;Agent 之间的调用关系应该有明确的分层，避免形成死循环。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 优雅降级
&lt;/h3&gt;

&lt;p&gt;单个 Agent 失败不应该导致整个系统崩溃，需要有容错和重试机制。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 成本控制
&lt;/h3&gt;

&lt;p&gt;多智能体系统通常涉及多次 LLM 调用，需要考虑成本优化策略，如缓存、结果复用等。&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 可观测性
&lt;/h3&gt;

&lt;p&gt;与微服务架构类似，需要完整的日志、追踪和监控能力。&lt;/p&gt;

&lt;h2&gt;
  
  
  未来展望
&lt;/h2&gt;

&lt;p&gt;随着大语言模型能力的不断提升，多智能体系统将成为构建复杂 AI 应用的主流架构。从当前的 GitHub 趋势来看，&lt;strong&gt;Agent 编排框架、工具增强、记忆系统&lt;/strong&gt; 将是未来架构演进的关键方向。&lt;/p&gt;

&lt;p&gt;如果你想深入这个领域，建议从以下方向开始：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;学习 LangChain、AutoGen 等主流框架&lt;/li&gt;
&lt;li&gt;理解 MCP（Model Context Protocol）协议&lt;/li&gt;
&lt;li&gt;掌握向量数据库和记忆系统设计&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;本文是软件架构系列文章的一部分，如果你对系统设计、微服务、DDD 等话题感兴趣，欢迎关注我的更多内容。&lt;/em&gt;&lt;/p&gt;

</description>
      <category>架构</category>
      <category>ai</category>
      <category>多智能体</category>
      <category>软件设计</category>
    </item>
    <item>
      <title>Event Sourcing 实战：让业务数据自己说话</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Mon, 30 Mar 2026 01:06:36 +0000</pubDate>
      <link>https://dev.to/tianxin/event-sourcing-shi-zhan-rang-ye-wu-shu-ju-zi-ji-shuo-hua-41pk</link>
      <guid>https://dev.to/tianxin/event-sourcing-shi-zhan-rang-ye-wu-shu-ju-zi-ji-shuo-hua-41pk</guid>
      <description>&lt;h1&gt;
  
  
  Event Sourcing 实战：让业务数据自己说话
&lt;/h1&gt;

&lt;p&gt;如果你曾经因为"为什么这个订单状态变成这样了"而抓狂，或者因为数据库里的数据对不上而排查到凌晨——那么 Event Sourcing 可能是你一直在找的答案。&lt;/p&gt;

&lt;h2&gt;
  
  
  什么是 Event Sourcing？
&lt;/h2&gt;

&lt;p&gt;传统架构把当前状态存在数据库里：订单表里存着"已发货"，用户表里存着当前余额。这种做法的问题是：&lt;strong&gt;状态会覆盖历史&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;Event Sourcing 的核心思路完全不同：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;不要存储当前状态，存储导致状态变化的所有事件。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;当前状态是事件的&lt;strong&gt;结果&lt;/strong&gt;，而不是数据本身。&lt;/p&gt;

&lt;p&gt;举个例子，银行账户：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;传统方式：余额 = 1000元
Event Sourcing：存款(+500) → 取款(-200) → 利息(+10) → 当前余额 = 1310元
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;第二种方式告诉你的不只是"现在有多少钱"，而是&lt;strong&gt;完整的资金流动历史&lt;/strong&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  为什么值得用？
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. 完整审计日志是副产品&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;金融、订单、物流——这些场景天然需要审计。在传统架构里，你需要额外建审计表；在 Event Sourcing 里，你只是在用正确的方式存储数据。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. 时间旅行成为可能&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;任意时间点的系统状态都可以重建。如果用户问"三天前的账户是什么情况"，你只需要重放事件到那个时间点。这对于调试、复盘、甚至用户纠纷处理都是神器。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 事件驱动天然集成&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;事件就是消息。你可以在事件写入时触发下游流程——通知、分析、实时看板——不需要额外的消息队列介入。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. 支持高并发写入&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;事件追加（Append-only）是顺序写的，天然支持高性能日志存储。Kafka、Pulsar 都能轻松承载每秒百万级事件写入。&lt;/p&gt;

&lt;h2&gt;
  
  
  架构实现
&lt;/h2&gt;

&lt;h3&gt;
  
  
  核心组件
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;命令 -&amp;gt; 聚合根 -&amp;gt; Event Store
                 |
                 v
              投影器 -&amp;gt; 读模型
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  用代码说话
&lt;/h3&gt;

&lt;p&gt;假设一个电商订单场景：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
    &lt;span class="n"&gt;aggregate_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderPlaced&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;total_amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderPaid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;payment_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderShipped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tracking_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;carrier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;draft&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;draft&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;订单已是 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 状态，无法下单&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;OrderPlaced&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
            &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;aggregate_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OrderPlaced&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;total_amount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;placed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payment_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;placed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;订单已是 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 状态，无法支付&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;OrderPaid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
            &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;aggregate_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OrderPaid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;payment_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payment_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;paid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ship&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tracking&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;carrier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;paid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;订单已是 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 状态，无法发货&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;OrderShipped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
            &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;aggregate_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OrderShipped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;tracking_number&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tracking&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;carrier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;carrier&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_uncommitted_events&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mark_committed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="nd"&gt;@staticmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;rebuild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Order&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;aggregate_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderPlaced&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;placed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderPaid&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;paid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderShipped&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;关键点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;命令验证状态&lt;/strong&gt;：下单、支付、发货只能在正确的状态下执行&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;事件不可变&lt;/strong&gt;：一旦写入 Event Store，永不修改&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;状态重建&lt;/strong&gt;：通过重放事件可以还原任意时刻的订单状态&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Event Store 设计
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderRepository&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_uncommitted_events&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;

        &lt;span class="n"&gt;stream_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;stream_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;expected_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mark_committed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;stream_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stream_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rebuild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  投影器：构建读模型
&lt;/h3&gt;

&lt;p&gt;事件写入后，你需要把数据投影到读模型（用于查询）：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderReadModel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderPlaced&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INSERT INTO orders (id, customer, total, status, created_at) VALUES (?, ?, ?, ?, ?)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aggregate_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;placed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderPaid&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;UPDATE orders SET status = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;paid&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, paid_at = ? WHERE id = ?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aggregate_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderShipped&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;UPDATE orders SET status = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;shipped&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, tracking = ? WHERE id = ?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tracking_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;aggregate_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  实战中的挑战
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. 事件版本演化&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;业务在变，事件结构也会变。需要 Upcasting 来做版本迁移：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;upcast_v1_to_v2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;version&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;event_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;currency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;currency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CNY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;event_data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. 快照优化&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;订单如果有一万条事件，重放会很慢。定期生成快照可以解决这个问题：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Snapshot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;
    &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. 查询性能&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Event Store 是 append-only 日志，复杂查询很慢。需要投影到专门的读模型数据库（PostgreSQL、Elasticsearch、ClickHouse）。&lt;/p&gt;

&lt;h2&gt;
  
  
  什么时候不该用？
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;简单 CRUD 应用&lt;/strong&gt;：状态简单且不需要审计&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;需要强事务一致性&lt;/strong&gt;：Event Sourcing 的最终一致性不是所有场景都适合&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;团队不熟悉&lt;/strong&gt;：技术债务是真实存在的&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  工具链推荐
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EventStoreDB&lt;/strong&gt;：专门为 Event Sourcing 设计的数据库&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marten&lt;/strong&gt;（.NET）：基于 PostgreSQL 的轻量实现&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EventFlow&lt;/strong&gt;（.NET）：完整的 DDD + ES 框架&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confluent Kafka&lt;/strong&gt;：分布式事件流平台&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Axon Framework&lt;/strong&gt;（Java）：成熟的 CQRS/ES 框架&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;Event Sourcing 不是银弹，但它解决的是真实痛点：当你的业务需要完整的历史、可追溯的决策、或者事件驱动的下游集成时，它值得认真考虑。&lt;/p&gt;

&lt;p&gt;它的代价是复杂度——你需要在投影器、版本迁移、快照上投入额外的工程量。选择它的理由应该是&lt;strong&gt;业务需要&lt;/strong&gt;，而不是&lt;strong&gt;技术酷炫&lt;/strong&gt;。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;如果你正在构建一个金融系统、订单处理流程、或者任何需要"为什么变成这样"的场景——现在你知道该往哪个方向走了。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;*本文是软件架构系列的延续，建议从系统设计基础指南开始构建你的架构知识体系。&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>database</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>深入理解微服务架构：从小白到生产级系统实战指南</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Sun, 29 Mar 2026 01:06:27 +0000</pubDate>
      <link>https://dev.to/tianxin/shen-ru-li-jie-wei-fu-wu-jia-gou-cong-xiao-bai-dao-sheng-chan-ji-xi-tong-shi-zhan-zhi-nan-58cp</link>
      <guid>https://dev.to/tianxin/shen-ru-li-jie-wei-fu-wu-jia-gou-cong-xiao-bai-dao-sheng-chan-ji-xi-tong-shi-zhan-zhi-nan-58cp</guid>
      <description>&lt;h1&gt;
  
  
  微服务架构基础指南：从小型应用到大型分布式系统的设计艺术
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;微服务架构是每个开发者必须掌握的核心技能。本文将带你系统性地理解如何设计可扩展、高可用的软件系统。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  什么是微服务架构？
&lt;/h2&gt;

&lt;p&gt;微服务架构（System Design）是关于如何构建软件系统的技术决策过程。它包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;架构选择&lt;/strong&gt;：单体、模块化、微服务还是无服务器？&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;数据存储&lt;/strong&gt;：关系型数据库、NoSQL、缓存如何选型？&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;系统交互&lt;/strong&gt;：API设计、消息队列、服务间通信&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;可扩展性&lt;/strong&gt;：如何应对流量增长？&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;可靠性&lt;/strong&gt;：如何保证系统持续可用？&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  微服务架构的核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 扩展性（Scalability）
&lt;/h3&gt;

&lt;p&gt;扩展性是指系统处理增长负载的能力。有两种主要方式：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;垂直扩展（Scale Up）&lt;/strong&gt;：增加单机资源（CPU、内存、磁盘）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;水平扩展（Scale Out）&lt;/strong&gt;：增加更多服务器节点&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;最佳实践&lt;/strong&gt;：优先考虑水平扩展，它是云原生时代的标配。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. 可用性（Availability）
&lt;/h3&gt;

&lt;p&gt;可用性是指系统正常运行的时间比例。常见的衡量指标：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;可用性&lt;/th&gt;
&lt;th&gt;年停机时间&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;99% (2个9)&lt;/td&gt;
&lt;td&gt;87.6小时&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99.9% (3个9)&lt;/td&gt;
&lt;td&gt;8.76小时&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99.99% (4个9)&lt;/td&gt;
&lt;td&gt;52分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3. 一致性（Consistency）
&lt;/h3&gt;

&lt;p&gt;分布式系统中的CAP定理告诉我们：一致性、可用性、分区容错性只能同时满足两个。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;强一致性&lt;/strong&gt;：所有节点在同一时刻看到相同数据&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;最终一致性&lt;/strong&gt;：数据最终会同步到所有节点&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  常见架构模式
&lt;/h2&gt;

&lt;h3&gt;
  
  
  单体架构（Monolithic）
&lt;/h3&gt;

&lt;p&gt;所有功能打包在一个应用中。适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;小型项目或原型&lt;/li&gt;
&lt;li&gt;团队规模小（&amp;lt;10人）&lt;/li&gt;
&lt;li&gt;初期快速迭代&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：简单、部署容易、调试方便&lt;br&gt;
&lt;strong&gt;缺点&lt;/strong&gt;：难以扩展、技术栈单一、可靠性风险&lt;/p&gt;

&lt;h3&gt;
  
  
  微服务架构（Microservices）
&lt;/h3&gt;

&lt;p&gt;将应用拆分为独立部署的服务。适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;大型复杂系统&lt;/li&gt;
&lt;li&gt;需要独立扩展不同功能模块&lt;/li&gt;
&lt;li&gt;多团队并行开发&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：独立部署、技术多样性、故障隔离&lt;br&gt;
&lt;strong&gt;缺点&lt;/strong&gt;：分布式系统复杂性、运维成本高&lt;/p&gt;

&lt;h3&gt;
  
  
  事件驱动架构（Event-Driven）
&lt;/h3&gt;

&lt;p&gt;通过事件进行服务间通信。适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;需要高实时性的系统&lt;/li&gt;
&lt;li&gt;复杂的业务流程&lt;/li&gt;
&lt;li&gt;解耦服务间依赖&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  数据存储选择指南
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;推荐存储&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;事务性数据&lt;/td&gt;
&lt;td&gt;PostgreSQL/MySQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;键值缓存&lt;/td&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文档存储&lt;/td&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;全文搜索&lt;/td&gt;
&lt;td&gt;Elasticsearch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;分析报表&lt;/td&gt;
&lt;td&gt;ClickHouse/Snowflake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;对象文件&lt;/td&gt;
&lt;td&gt;S3/OSS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  微服务架构面试准备
&lt;/h2&gt;

&lt;p&gt;如果你在准备技术面试，微服务架构是必考内容。建议按以下步骤练习：&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 明确需求
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;澄清功能需求（功能性 vs 非功能性）&lt;/li&gt;
&lt;li&gt;估算规模（用户量、QPS、数据量）&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 高层设计
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;画出核心组件&lt;/li&gt;
&lt;li&gt;确定数据流向&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 核心细节设计
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;API设计&lt;/li&gt;
&lt;li&gt;数据库Schema&lt;/li&gt;
&lt;li&gt;处理瓶颈和极端情况&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 总结
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;回顾设计决策&lt;/li&gt;
&lt;li&gt;考虑扩展性和容错&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  推荐学习资源
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;书籍&lt;/strong&gt;：《微服务架构面试指南》、《 Designing Data-Intensive Applications》&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub项目&lt;/strong&gt;：

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/binhnguyennus/awesome-scalability" rel="noopener noreferrer"&gt;awesome-scalability&lt;/a&gt; - 可扩展架构精选&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/karanpratapsingh/system-design" rel="noopener noreferrer"&gt;system-design&lt;/a&gt; - 微服务架构入门&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kamranahmedse/design-patterns-for-humans" rel="noopener noreferrer"&gt;design-patterns-for-humans&lt;/a&gt; - 设计模式图解&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;微服务架构不是一蹴而就的技能，而是需要不断实践和积累的经验。记住以下原则：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;简单优先&lt;/strong&gt;：不要过度设计&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;循序渐进&lt;/strong&gt;：从简单开始，逐步演进&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;权衡取舍&lt;/strong&gt;：没有完美的架构，只有最适合的&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;关注业务&lt;/strong&gt;：技术服务于业务需求&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;🏗️ &lt;strong&gt;记住&lt;/strong&gt;：好的微服务架构是在约束条件下找到最优解。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;如果你觉得这篇文章有帮助，欢迎关注、点赞、评论！&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  软件架构 #微服务架构 #程序员
&lt;/h1&gt;

</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>microservices</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>系统设计基础指南：从小型应用到大型分布式系统的设计艺术</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Sat, 28 Mar 2026 01:06:13 +0000</pubDate>
      <link>https://dev.to/tianxin/xi-tong-she-ji-ji-chu-zhi-nan-cong-xiao-xing-ying-yong-dao-da-xing-fen-bu-shi-xi-tong-de-she-ji-yi-zhu-5dbn</link>
      <guid>https://dev.to/tianxin/xi-tong-she-ji-ji-chu-zhi-nan-cong-xiao-xing-ying-yong-dao-da-xing-fen-bu-shi-xi-tong-de-she-ji-yi-zhu-5dbn</guid>
      <description>&lt;h1&gt;
  
  
  系统设计基础指南：从小型应用到大型分布式系统的设计艺术
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;系统设计是每个开发者必须掌握的核心技能。本文将带你系统性地理解如何设计可扩展、高可用的软件系统。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  什么是系统设计？
&lt;/h2&gt;

&lt;p&gt;系统设计（System Design）是关于如何构建软件系统的技术决策过程。它包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;架构选择&lt;/strong&gt;：单体、模块化、微服务还是无服务器？&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;数据存储&lt;/strong&gt;：关系型数据库、NoSQL、缓存如何选型？&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;系统交互&lt;/strong&gt;：API设计、消息队列、服务间通信&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;可扩展性&lt;/strong&gt;：如何应对流量增长？&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;可靠性&lt;/strong&gt;：如何保证系统持续可用？&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  系统设计的核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 扩展性（Scalability）
&lt;/h3&gt;

&lt;p&gt;扩展性是指系统处理增长负载的能力。有两种主要方式：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;垂直扩展（Scale Up）&lt;/strong&gt;：增加单机资源（CPU、内存、磁盘）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;水平扩展（Scale Out）&lt;/strong&gt;：增加更多服务器节点&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;最佳实践&lt;/strong&gt;：优先考虑水平扩展，它是云原生时代的标配。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. 可用性（Availability）
&lt;/h3&gt;

&lt;p&gt;可用性是指系统正常运行的时间比例。常见的衡量指标：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;可用性&lt;/th&gt;
&lt;th&gt;年停机时间&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;99% (2个9)&lt;/td&gt;
&lt;td&gt;87.6小时&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99.9% (3个9)&lt;/td&gt;
&lt;td&gt;8.76小时&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99.99% (4个9)&lt;/td&gt;
&lt;td&gt;52分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3. 一致性（Consistency）
&lt;/h3&gt;

&lt;p&gt;分布式系统中的CAP定理告诉我们：一致性、可用性、分区容错性只能同时满足两个。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;强一致性&lt;/strong&gt;：所有节点在同一时刻看到相同数据&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;最终一致性&lt;/strong&gt;：数据最终会同步到所有节点&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  常见架构模式
&lt;/h2&gt;

&lt;h3&gt;
  
  
  单体架构（Monolithic）
&lt;/h3&gt;

&lt;p&gt;所有功能打包在一个应用中。适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;小型项目或原型&lt;/li&gt;
&lt;li&gt;团队规模小（&amp;lt;10人）&lt;/li&gt;
&lt;li&gt;初期快速迭代&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：简单、部署容易、调试方便&lt;br&gt;
&lt;strong&gt;缺点&lt;/strong&gt;：难以扩展、技术栈单一、可靠性风险&lt;/p&gt;

&lt;h3&gt;
  
  
  微服务架构（Microservices）
&lt;/h3&gt;

&lt;p&gt;将应用拆分为独立部署的服务。适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;大型复杂系统&lt;/li&gt;
&lt;li&gt;需要独立扩展不同功能模块&lt;/li&gt;
&lt;li&gt;多团队并行开发&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：独立部署、技术多样性、故障隔离&lt;br&gt;
&lt;strong&gt;缺点&lt;/strong&gt;：分布式系统复杂性、运维成本高&lt;/p&gt;

&lt;h3&gt;
  
  
  事件驱动架构（Event-Driven）
&lt;/h3&gt;

&lt;p&gt;通过事件进行服务间通信。适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;需要高实时性的系统&lt;/li&gt;
&lt;li&gt;复杂的业务流程&lt;/li&gt;
&lt;li&gt;解耦服务间依赖&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  数据存储选择指南
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;推荐存储&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;事务性数据&lt;/td&gt;
&lt;td&gt;PostgreSQL/MySQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;键值缓存&lt;/td&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文档存储&lt;/td&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;全文搜索&lt;/td&gt;
&lt;td&gt;Elasticsearch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;分析报表&lt;/td&gt;
&lt;td&gt;ClickHouse/Snowflake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;对象文件&lt;/td&gt;
&lt;td&gt;S3/OSS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  系统设计面试准备
&lt;/h2&gt;

&lt;p&gt;如果你在准备技术面试，系统设计是必考内容。建议按以下步骤练习：&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 明确需求
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;澄清功能需求（功能性 vs 非功能性）&lt;/li&gt;
&lt;li&gt;估算规模（用户量、QPS、数据量）&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 高层设计
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;画出核心组件&lt;/li&gt;
&lt;li&gt;确定数据流向&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 核心细节设计
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;API设计&lt;/li&gt;
&lt;li&gt;数据库Schema&lt;/li&gt;
&lt;li&gt;处理瓶颈和极端情况&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 总结
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;回顾设计决策&lt;/li&gt;
&lt;li&gt;考虑扩展性和容错&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  推荐学习资源
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;书籍&lt;/strong&gt;：《系统设计面试指南》、《 Designing Data-Intensive Applications》&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub项目&lt;/strong&gt;：

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/binhnguyennus/awesome-scalability" rel="noopener noreferrer"&gt;awesome-scalability&lt;/a&gt; - 可扩展架构精选&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/karanpratapsingh/system-design" rel="noopener noreferrer"&gt;system-design&lt;/a&gt; - 系统设计入门&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kamranahmedse/design-patterns-for-humans" rel="noopener noreferrer"&gt;design-patterns-for-humans&lt;/a&gt; - 设计模式图解&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;系统设计不是一蹴而就的技能，而是需要不断实践和积累的经验。记住以下原则：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;简单优先&lt;/strong&gt;：不要过度设计&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;循序渐进&lt;/strong&gt;：从简单开始，逐步演进&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;权衡取舍&lt;/strong&gt;：没有完美的架构，只有最适合的&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;关注业务&lt;/strong&gt;：技术服务于业务需求&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;🏗️ &lt;strong&gt;记住&lt;/strong&gt;：好的系统设计是在约束条件下找到最优解。&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;如果你觉得这篇文章有帮助，欢迎关注、点赞、评论！&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  软件架构 #系统设计 #程序员
&lt;/h1&gt;

</description>
      <category>tutorial</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Saga模式：分布式事务的协调艺术</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Thu, 26 Mar 2026 01:08:04 +0000</pubDate>
      <link>https://dev.to/tianxin/sagamo-shi-fen-bu-shi-shi-wu-de-xie-diao-yi-zhu-3kpg</link>
      <guid>https://dev.to/tianxin/sagamo-shi-fen-bu-shi-shi-wu-de-xie-diao-yi-zhu-3kpg</guid>
      <description>&lt;h2&gt;
  
  
  什么是Saga模式？
&lt;/h2&gt;

&lt;p&gt;Saga模式是一种分布式事务管理模式，最早由1987年的一篇学术论文提出。它通过将一个长时间运行的事务拆分成多个本地事务，每个本地事务都有对应的补偿操作，以此来保证数据一致性。&lt;/p&gt;

&lt;p&gt;与传统的两阶段提交（2PC）不同，Saga采用异步补偿的方式，避免了分布式锁带来的性能瓶颈。&lt;/p&gt;

&lt;h2&gt;
  
  
  Saga的工作原理
&lt;/h2&gt;

&lt;p&gt;Saga模式的核心思想是&lt;strong&gt;将大事务拆成小事务，每个小事务都有对应的补偿操作&lt;/strong&gt;。当某个步骤失败时，之前已执行的操作需要被逐一撤销。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Order Service -&amp;gt; Payment Service -&amp;gt; Inventory Service -&amp;gt; Shipping Service
     |               |                |                 |
     v               v                v                 v
  Create          Charge           Reserve          Schedule
  Order           Payment           Stock             Delivery
     |               |                |                 |
     v               v                v                 v
  Cancel (补偿)  Refund (补偿)    Release (补偿)   Cancel (补偿)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  编排 vs 编舞
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;编舞式（Choreography）：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;各服务通过事件相互调用&lt;/li&gt;
&lt;li&gt;优点：简单，去中心化&lt;/li&gt;
&lt;li&gt;缺点：难以追踪，测试困难&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;编排式（Orchestration）：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;由一个中央协调器管理整个流程&lt;/li&gt;
&lt;li&gt;优点：易于监控和调试&lt;/li&gt;
&lt;li&gt;缺点：协调器可能成为单点故障&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  代码实现示例
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 编排式Saga协调器
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderSagaOrchestrator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="nc"&gt;SagaStep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CreateOrderStep&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;compensate_order&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nc"&gt;SagaStep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ChargePaymentStep&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;refund_payment&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nc"&gt;SagaStep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ReserveInventoryStep&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;release_inventory&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nc"&gt;SagaStep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ScheduleShippingStep&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;cancel_shipping&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;completed_steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;completed_steps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# 执行补偿操作
&lt;/span&gt;            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;completed_steps&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compensate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;SagaFailedException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Saga模式的优缺点
&lt;/h2&gt;

&lt;h3&gt;
  
  
  优点
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;高可用&lt;/strong&gt;：无长期锁定资源&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;高性能&lt;/strong&gt;：避免分布式锁&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;易于扩展&lt;/strong&gt;：新增步骤不影响现有逻辑&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  缺点
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;数据一致性较弱&lt;/strong&gt;：只能保证最终一致性&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;补偿逻辑复杂&lt;/strong&gt;：需要仔细设计&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;调试困难&lt;/strong&gt;：分布式调用难以追踪&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  适用场景
&lt;/h2&gt;

&lt;p&gt;Saga模式特别适合以下场景：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;业务流程长，涉及多个服务&lt;/li&gt;
&lt;li&gt;对一致性要求不是极度严格（可接受最终一致）&lt;/li&gt;
&lt;li&gt;需要高并发、高性能的系统&lt;/li&gt;
&lt;li&gt;订单处理、支付系统、旅行预订等&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  实践建议
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;幂等性设计&lt;/strong&gt;：确保每个操作可以安全重试&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;超时机制&lt;/strong&gt;：设置合理的超时时间，避免无限等待&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;监控告警&lt;/strong&gt;：实时监控Saga执行状态&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;补偿日志&lt;/strong&gt;：记录补偿操作，便于问题排查&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;Saga模式是处理分布式事务的一种有效方式，通过拆分事务 + 补偿机制，在保证最终一致性的同时，获得更好的性能和可用性。理解并合理运用Saga模式，是架构师必备的技能之一。&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;推荐阅读：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;《Domain-Driven Design》- Eric Evans&lt;/li&gt;
&lt;li&gt;《Building Microservices》- Sam Newman&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cs.cornell.edu/andru/cs711/2002fa/112-saga.pdf" rel="noopener noreferrer"&gt; Saga Pattern 论文&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>saga</category>
      <category>microservices</category>
    </item>
    <item>
      <title>服务网格Service Mesh：云原生时代的微服务通信基础设施</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Tue, 24 Mar 2026 01:04:38 +0000</pubDate>
      <link>https://dev.to/tianxin/fu-wu-wang-ge-service-meshyun-yuan-sheng-shi-dai-de-wei-fu-wu-tong-xin-ji-chu-she-shi-21l4</link>
      <guid>https://dev.to/tianxin/fu-wu-wang-ge-service-meshyun-yuan-sheng-shi-dai-de-wei-fu-wu-tong-xin-ji-chu-she-shi-21l4</guid>
      <description>&lt;h1&gt;
  
  
  服务网格Service Mesh：云原生时代的微服务通信基础设施
&lt;/h1&gt;

&lt;h2&gt;
  
  
  什么是服务网格？
&lt;/h2&gt;

&lt;p&gt;服务网格（Service Mesh）是一种用于处理服务间通信的基础设施层。它的核心目标是让微服务之间的通信更加可靠、安全、可观测。&lt;/p&gt;

&lt;p&gt;在传统的微服务架构中，每个服务都需要自行处理服务发现、负载均衡、熔断、限流、链路追踪等横切关注点。这导致业务代码与基础设施逻辑高度耦合，代码变得复杂且难以维护。&lt;/p&gt;

&lt;p&gt;服务网格通过将这部分逻辑下沉到独立的代理层（通常称为Sidecar）来解决这个问题。每个服务实例都会部署一个Sidecar代理，所有进出该服务的流量都会经过这个代理。&lt;/p&gt;

&lt;h2&gt;
  
  
  服务网格的核心组件
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 数据平面（Data Plane）
&lt;/h3&gt;

&lt;p&gt;数据平面由Sidecar代理组成，负责实际的数据传输。常见的实现包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Envoy&lt;/strong&gt;：Lyft开源的高性能代理，已成为事实标准&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MOSN&lt;/strong&gt;：阿里巴巴开源的云原生代理&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linkerd&lt;/strong&gt;：专门为服务网格设计的轻量级代理&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 控制平面（Control Plane）
&lt;/h3&gt;

&lt;p&gt;控制平面负责管理Sidecar代理的配置和策略：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Istio&lt;/strong&gt;：最流行的服务网格解决方案（注意：Istio已于2024年将品牌捐赠给OpenSSF）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kuma&lt;/strong&gt;：Kong开源的服务网格&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linkerd&lt;/strong&gt;：独立的控制平面&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  服务网格的核心功能
&lt;/h2&gt;

&lt;h3&gt;
  
  
  流量管理
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;负载均衡&lt;/strong&gt;：支持轮询、随机、最少连接等多种策略&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;熔断&lt;/strong&gt;：当下游服务故障时自动隔离，防止级联失败&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;超时与重试&lt;/strong&gt;：配置超时时间和自动重试策略&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;流量镜像&lt;/strong&gt;：将流量复制到测试环境，实现灰度发布&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  安全
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;mTLS&lt;/strong&gt;：服务间自动双向TLS加密&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;授权策略&lt;/strong&gt;：基于角色的访问控制&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;证书管理&lt;/strong&gt;：自动颁发和轮换证书&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  可观测性
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;指标收集&lt;/strong&gt;：自动采集请求延迟、成功率、流量等指标&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;分布式追踪&lt;/strong&gt;：与Jaeger、Zipkin等追踪系统集成&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;日志收集&lt;/strong&gt;：统一的日志采集和分析&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  服务网格的优缺点
&lt;/h2&gt;

&lt;h3&gt;
  
  
  优点
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;解耦业务与基础设施&lt;/strong&gt;：开发者专注于业务逻辑，通信问题交给网格处理&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;统一策略执行&lt;/strong&gt;：所有服务共享一致的通信策略&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;渐进式采用&lt;/strong&gt;：可以逐步引入，无需一次性重构整个系统&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;语言无关&lt;/strong&gt;：支持多种编程语言的服务共存&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  缺点
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;复杂度增加&lt;/strong&gt;：需要额外学习和管理控制平面&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;性能开销&lt;/strong&gt;：每个请求都经过Sidecar代理&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;调试困难&lt;/strong&gt;：问题可能发生在代理层，不易定位&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;资源消耗&lt;/strong&gt;：Sidecar占用额外资源&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  何时使用服务网格？
&lt;/h2&gt;

&lt;p&gt;服务网格适用于以下场景：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;微服务数量较多（超过10个）&lt;/li&gt;
&lt;li&gt;需要统一的流量管理和安全策略&lt;/li&gt;
&lt;li&gt;对可观测性有较高要求&lt;/li&gt;
&lt;li&gt;多语言混合开发&lt;/li&gt;
&lt;li&gt;需要支持渐进式架构演进&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;对于小型系统或初创项目，建议先从简单的方式开始，随着系统规模增长再考虑引入服务网格。&lt;/p&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;服务网格是云原生时代的重要基础设施，它将微服务通信的关注点从应用层剥离到基础设施层。虽然增加了系统复杂度，但为大规模微服务系统提供了可靠的通信保障。&lt;/p&gt;

&lt;p&gt;理解服务网格的原理和适用场景，对于现代架构师和开发者来说是必备技能。&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>microservices</category>
      <category>istio</category>
      <category>devops</category>
    </item>
    <item>
      <title>CQRS模式：命令查询职责分离的架构艺术</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Mon, 23 Mar 2026 01:04:18 +0000</pubDate>
      <link>https://dev.to/tianxin/cqrsmo-shi-ming-ling-cha-xun-zhi-ze-fen-chi-de-jia-gou-yi-zhu-4116</link>
      <guid>https://dev.to/tianxin/cqrsmo-shi-ming-ling-cha-xun-zhi-ze-fen-chi-de-jia-gou-yi-zhu-4116</guid>
      <description>&lt;h1&gt;
  
  
  CQRS模式：命令查询职责分离的架构艺术
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;"读和写是不同的操作，为什么要用同一个模型来处理？"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;在传统的CRUD应用中，我们通常使用同一个数据模型来handle读和写操作。然而，随着系统复杂度提升，这种方式会带来性能瓶颈、领域逻辑混乱等问题。&lt;strong&gt;CQRS（Command Query Responsibility Segregation）&lt;/strong&gt; 模式应运而生，它将读操作和写操作分离，让系统更灵活、更高效。&lt;/p&gt;

&lt;h2&gt;
  
  
  什么是CQRS？
&lt;/h2&gt;

&lt;p&gt;CQRS核心思想很简单：&lt;strong&gt;将读操作（Query）和写操作（Command）分开处理&lt;/strong&gt;。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Command（命令）&lt;/strong&gt;：修改系统状态的操作，如创建、更新、删除&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query（查询）&lt;/strong&gt;：只读取数据，不改变状态&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;传统的架构是：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;用户 → CRUD Model → 数据库
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CQRS架构是：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;用户 → Command Model → 数据库
   ↘ Query Model → 数据库
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CQRS的核心优势
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 性能优化
&lt;/h3&gt;

&lt;p&gt;读和写的性能需求往往不同：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;读操作可能需要复杂的联表查询、聚合&lt;/li&gt;
&lt;li&gt;写操作需要严格的业务验证&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;分离后，可以分别为读和写优化：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;读端：使用物化视图、缓存、反范式化&lt;/li&gt;
&lt;li&gt;写端：保持规范的领域模型&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 领域模型清晰
&lt;/h3&gt;

&lt;p&gt;写模型（Command Model）专注于业务逻辑，保持领域的纯粹性&lt;br&gt;
读模型（Query Model）专为展示需求定制，不受业务规则污染&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 可扩展性强
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;读负载高？独立扩展读服务&lt;/li&gt;
&lt;li&gt;写负载高？独立扩展写服务&lt;/li&gt;
&lt;li&gt;无需互相影响&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 支持复杂业务场景
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;写操作需要严格的验证和业务流程&lt;/li&gt;
&lt;li&gt;读操作可能需要聚合多个数据源&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  CQRS实现模式
&lt;/h2&gt;

&lt;h3&gt;
  
  
  模式一：同步CQRS（最简单）
&lt;/h3&gt;

&lt;p&gt;读写共用同一个数据库，但在应用层分离&lt;/p&gt;

&lt;h3&gt;
  
  
  模式二：事件驱动CQRS（推荐）
&lt;/h3&gt;

&lt;p&gt;使用事件溯源（Event Sourcing），写操作产生事件，读端通过订阅事件更新物化视图&lt;/p&gt;

&lt;h2&gt;
  
  
  实战代码示例
&lt;/h2&gt;

&lt;h3&gt;
  
  
  定义Command和Query模型
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Command Model - 写模型
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateOrderCommand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;订单不能为空&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

&lt;span class="c1"&gt;# Query Model - 读模型
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderDetailQuery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Command Handler
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderCommandHandler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event_store&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event_store&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_create_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CreateOrderCommand&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# 创建订单事件
&lt;/span&gt;        &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OrderCreatedEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Query Handler
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderQueryHandler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;read_database&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;read_database&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_order_detail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;OrderDetailQuery&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 直接从物化视图读取，不需要复杂的聚合
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;order_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_customer_orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 为读取优化的查询
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_summary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;customer_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  CQRS的挑战与注意事项
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 数据一致性
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;读写分离后，数据同步需要时间（最终一致性）&lt;/li&gt;
&lt;li&gt;需要权衡：实时性要求高的场景慎用&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 复杂度增加
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;两套模型需要维护&lt;/li&gt;
&lt;li&gt;事件驱动模式需要处理事件幂等、补偿等&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 不适用于所有场景
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;简单CRUD应用不需要CQRS&lt;/li&gt;
&lt;li&gt;读写比例接近的系统收益不大&lt;/li&gt;
&lt;li&gt;团队经验不足时慎用&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 建议结合DDD使用
&lt;/h3&gt;

&lt;p&gt;CQRS与领域驱动设计天然契合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Command对应Domain Command&lt;/li&gt;
&lt;li&gt;Query端可以有自己的Read Model&lt;/li&gt;
&lt;li&gt;事件驱动是DDD常用的技术手段&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  什么时候使用CQRS？
&lt;/h2&gt;

&lt;p&gt;✅ 推荐使用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;复杂业务逻辑的企业应用&lt;/li&gt;
&lt;li&gt;读写负载差异明显的系统&lt;/li&gt;
&lt;li&gt;需要高性能读取的场景（如报表、仪表盘）&lt;/li&gt;
&lt;li&gt;基于DDD的微服务架构&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ 不建议使用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;简单的CRUD应用&lt;/li&gt;
&lt;li&gt;强一致性要求极高的场景&lt;/li&gt;
&lt;li&gt;团队对模式不熟悉&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;CQRS不是银弹，但它为复杂系统提供了一种优雅的架构选择。通过将读和写分离，我们可以：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;获得更好的性能优化空间&lt;/li&gt;
&lt;li&gt;保持领域模型的清晰&lt;/li&gt;
&lt;li&gt;构建更具可扩展性的系统&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;记住：&lt;strong&gt;架构模式是为了解决问题，而不是为了使用而使用&lt;/strong&gt;。在合适的场景下，CQRS会成为你构建高质量系统的有力工具。&lt;/p&gt;




&lt;p&gt;&lt;em&gt;本文是软件架构系列文章的一部分，如果你对DDD、六边形架构等话题感兴趣，欢迎关注！&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>cqrs</category>
      <category>python</category>
      <category>backend</category>
    </item>
    <item>
      <title>深度解读六边形架构： Ports 与 Adapters 实战</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Sun, 22 Mar 2026 01:05:51 +0000</pubDate>
      <link>https://dev.to/tianxin/shen-du-jie-du-liu-bian-xing-jia-gou-ports-yu-adapters-shi-zhan-2dgf</link>
      <guid>https://dev.to/tianxin/shen-du-jie-du-liu-bian-xing-jia-gou-ports-yu-adapters-shi-zhan-2dgf</guid>
      <description>&lt;h1&gt;
  
  
  深度解读六边形架构：Ports 与 Adapters 实战
&lt;/h1&gt;

&lt;p&gt;你是否遇到过这样的困境：业务逻辑被分散在 Controller、Service、Repository 各个层级中？换个数据库、换个框架，整个系统都要伤筋动骨？&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;六边形架构（Hexagonal Architecture）&lt;/strong&gt; 就是来解决这些问题的。&lt;/p&gt;




&lt;h2&gt;
  
  
  什么是六边形架构？
&lt;/h2&gt;

&lt;p&gt;六边形架构由 Alistair Cockburn 提出，也叫&lt;strong&gt;端口与适配器架构（Ports and Adapters）&lt;/strong&gt;。它的核心思想是：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;将业务逻辑放在系统核心，通过端口与外部世界交互，适配器负责对接各种技术。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 核心领域（Domain/Core）
&lt;/h3&gt;

&lt;p&gt;这是系统的&lt;strong&gt;心脏&lt;/strong&gt;，只包含业务逻辑，不依赖任何外部框架。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 领域模型示例
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;total&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;can_cancel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confirmed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 端口（Ports）
&lt;/h3&gt;

&lt;p&gt;端口是&lt;strong&gt;核心领域与外部交互的接口&lt;/strong&gt;，分为：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;输入端口（Driving Ports）&lt;/strong&gt;：外部驱动系统操作的接口，如 API、服务接口&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;输出端口（Driven Ports）&lt;/strong&gt;：核心向外部请求帮助的接口，如 Repository、消息发送
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 输出端口示例 - 定义仓储接口
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. 适配器（Adapters）
&lt;/h3&gt;

&lt;p&gt;适配器是&lt;strong&gt;端口的具体实现&lt;/strong&gt;，连接外部技术：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;主适配器（Driving Adapters）&lt;/strong&gt;：HTTP 控制器、CLI、消息消费者&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;从适配器（Driven Adapters）&lt;/strong&gt;：数据库实现、第三方 API、消息队列
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 从适配器示例 - SQLAlchemy 实现
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SQLAlchemyOrderRepository&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  为什么需要六边形架构？
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;传统分层&lt;/th&gt;
&lt;th&gt;六边形架构&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;业务逻辑依赖框架&lt;/td&gt;
&lt;td&gt;业务逻辑完全独立&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;换数据库代价大&lt;/td&gt;
&lt;td&gt;随时替换适配器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;难以测试&lt;/td&gt;
&lt;td&gt;领域模型可单独测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;关注技术实现&lt;/td&gt;
&lt;td&gt;关注业务价值&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  实战案例：订单系统
&lt;/h2&gt;

&lt;h3&gt;
  
  
  目录结构
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── domain/           # 核心领域
│   ├── models/       # 领域模型
│   └── services/     # 领域服务
├── ports/            # 端口定义
│   ├── input/        # 输入端口
│   └── output/       # 输出端口
├── adapters/         # 适配器实现
│   ├── api/          # HTTP 适配器
│   └── persistence/  # 数据库适配器
└── application/      # 应用服务（用例）
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  代码实现
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# domain/models/order.py
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;total&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ports/output/order_repository.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Protocol&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;# application/create_order.py
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateOrderUseCase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;OrderRepository&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;

&lt;span class="c1"&gt;# adapters/persistence/sqlalchemy_repo.py
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SQLAlchemyOrderRepository&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  如何开始？
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;从核心开始&lt;/strong&gt;：先画出你的业务模型，不要想数据库、API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;定义端口&lt;/strong&gt;：明确核心需要什么（存储、消息通知...）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;实现适配器&lt;/strong&gt;：先用一个简单的适配器，后续可以替换&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;渐进式改造&lt;/strong&gt;：不需要一次性重构，先从新模块开始&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;六边形架构帮助我们：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;关注业务价值&lt;/strong&gt;：让代码服务于业务，而非技术&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;保持敏捷&lt;/strong&gt;：轻松应对技术变更&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;提升可测试性&lt;/strong&gt;：核心逻辑可以单独测试&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;明确边界&lt;/strong&gt;：端口和适配器各司其职&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;架构不是关于技术选择，而是关于如何组织代码让业务价值最大化。&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>架构</category>
      <category>软件设计</category>
      <category>hexagonalarchitecture</category>
      <category>编程</category>
    </item>
    <item>
      <title>六边形架构完全指南：让业务逻辑与技术细节解耦</title>
      <dc:creator>架构师小白</dc:creator>
      <pubDate>Sun, 22 Mar 2026 01:03:39 +0000</pubDate>
      <link>https://dev.to/tianxin/liu-bian-xing-jia-gou-wan-quan-zhi-nan-rang-ye-wu-luo-ji-yu-ji-zhu-xi-jie-jie-ou-42in</link>
      <guid>https://dev.to/tianxin/liu-bian-xing-jia-gou-wan-quan-zhi-nan-rang-ye-wu-luo-ji-yu-ji-zhu-xi-jie-jie-ou-42in</guid>
      <description>&lt;h1&gt;
  
  
  六边形架构
&lt;/h1&gt;

&lt;p&gt;测试&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
