消息传递与事件驱动设计

发布: (2026年1月17日 GMT+8 23:20)
4 min read
原文: Dev.to

Source: Dev.to

事件驱动架构 (EDA)

事件驱动架构是一种由小型、解耦的服务构建的现代模式,这些服务发布、消费或路由事件。

  • 事件:表示状态的变化或更新(例如,商品放入购物车、文件上传、订单准备发货)。
    • 事件可以携带完整状态(商品名称、价格、数量)或仅携带标识符(例如 “订单 #8942 已发货”),后者可用于查找相关信息。

与传统的请求驱动模型不同,EDA 促进了生产者和消费者服务之间的松耦合,使得扩展、更新和独立部署组件更加容易。

Amazon SQS(Simple Queue Service)

  • 完全托管的消息队列
  • 用于解耦应用组件

队列类型

类型投递保证排序
Standard至少一次投递尽力而为的排序
FIFO恰好一次处理严格排序

Amazon SNS(Simple Notification Service)

  • 发布/订阅消息服务
  • 一条消息可以投递给多个订阅者

常见订阅者

  • SQS
  • Lambda
  • Email / HTTP 端点

SNS 与 SQS 的比较

  • SNS 将消息推送给订阅者。
  • SQS 轮询获取消息。

Fan‑out 模式:SNS → 多个 SQS 队列。

Amazon EventBridge

Amazon EventBridge 是一个无服务器事件总线,帮助实现事件驱动架构。它通过将来自源(AWS 服务、自定义应用、第三方软件)的事件路由到目标(如 AWS Lambda、Amazon SNS、Amazon SQS 等),连接不同的服务和应用。

EventBridge 使系统能够解耦,组件独立运行并实时响应事件,从而提升可扩展性、灵活性和弹性。

何时使用哪项服务

服务典型使用场景
SQS异步处理、缓冲
SNSFan‑out 通知
EventBridge跨服务的事件路由

实验 7:使用 Amazon SQS 进行消息传递

目标

  • 使用 SQS 解耦应用组件。
  • 使用 Lambda 异步处理消息。
  • 为故障处理配置死信队列(DLQ)。

架构概览

Producer (Lambda / CLI) → Amazon SQS → Consumer (Lambda)
                                 ↳ Dead Letter Queue

步骤

  1. 创建标准队列

    • 前往 SQS → Create queue
    • 类型:Standard
    • 可见性超时:60 seconds
    • 点击 Create queue
  2. 创建死信队列(DLQ)

    • 再创建一个名为 order-processing-dlq 的 SQS 队列。
    • 在主队列的设置中,配置 DLQ:
      • Max receives:3
  3. 创建 Lambda 消费者

    • 前往 Lambda → Create function
    • 运行时:Python 3.12
    • 添加指向步骤 1 中创建的队列的 SQS 触发器。
    • 使用以下示例代码:
    def lambda_handler(event, context):
        for record in event['Records']:
            print(record['body'])
  4. 向队列发送消息

    aws sqs send-message \
        --queue-url <QUEUE_URL> \
        --message-body "Test message"

验证

  • 验证 Lambda 函数已处理该消息。
  • 确认在达到最大接收次数后失败的消息已被移动到 DLQ。
Back to Blog

相关文章

阅读更多 »

事件驱动设计与消息驱动设计

事件驱动设计(EDD) 在我们深入 EDD 之前,让我们先定义一下事件。事件是不可变的,表示过去的状态变化。EDD 的核心理念是…

大脱钩:企业能力图

《伟大解耦》系列第二部分 在第一部分中,我指出我们正目睹能力与呈现的解耦——即 SaaS 界面,远…

从领域事件到Webhooks

领域事件实现以下接口: ```php interface DomainEvent { public function aggregateRootId: string; public function displayReference: st... } ```