事件驱动架构 - 通过 Amazon EventBridge 实现松耦合系统设计

介绍利用 Amazon EventBridge 构建事件驱动架构的方法。

事件驱动架构的设计原则

事件驱动架构 (EDA) 是一种通过事件将系统组件松耦合连接的设计模式。组件只需发布事件,无需知道谁会消费该事件。这种松耦合特性使各组件能够独立部署、扩展和故障隔离。Amazon EventBridge 是 AWS 的无服务器事件总线服务,统一路由来自 AWS 服务、SaaS 应用程序和自定义应用程序的事件。在本地构建事件驱动架构需要运维 RabbitMQ 或 Apache Kafka 等消息代理,会产生集群管理、扩展和故障恢复的运维负担。EventBridge 是完全托管的,让您可以专注于事件的发布和消费。

EventBridge 的事件路由与过滤

EventBridge 最大的特点是基于内容的事件路由。通过定义事件模式,可以根据事件内容将其路由到特定目标。支持 JSON 字段值、前缀匹配、数值范围、IP 地址范围等丰富的过滤条件。一个事件总线最多可定义 300 条规则,每条规则最多可指定 5 个目标。目标可直接指定 LambdaSQSSNSStep FunctionsKinesisAPI Gateway 等 20 多种 AWS 服务,无需编写代码即可构建事件驱动的工作流。EventBridge 支持对事件 JSON 的任意字段进行模式匹配,实现更灵活的路由。此外,EventBridge 的输入转换功能可在规则内转换传递给目标的事件格式,简化消费者端的代码。以下是 EventBridge 规则的定义示例。 ```json { "source": ["my-app"], "detail-type": ["OrderCreated"], "detail": { "amount": [{"numeric": [">", 10000]}], "region": ["ap-northeast-1"] } } ```

SaaS 集成与 Schema Registry

EventBridge 可原生接收来自 30 多个 SaaS 合作伙伴(Zendesk、Datadog、Auth0、Shopify 等)的事件。可将 SaaS 应用程序的事件直接路由到 AWS 服务,无需自行构建 Webhook 接收服务器或轮询处理。EventBridge Schema Registry 自动发现事件的 Schema 并作为目录进行管理。启用 Schema Discovery 后,流经事件总线的事件 Schema 会自动注册,并可自动生成 Java、Python、TypeScript 的代码绑定。这使得事件的类型安全处理成为可能,提高开发者的生产力。此外,Event Grid 没有相当于 Schema Registry 的功能,事件 Schema 的管理需要开发者手动进行。EventBridge Pipes 以点对点方式连接事件源和目标,无需代码即可实现过滤、丰富和转换。 如需拓展服务集成方面的知识,也可以参考Amazon 上的专业书籍

EventBridge 与 Lambda、SQS 的集成模式

在以 EventBridge 为核心的事件驱动架构中,会使用 LambdaSQS 组合的多种集成模式。扇出模式将一个事件同时分发给多个 Lambda 函数,实现并行处理。缓冲模式从 EventBridge 向 SQS 发送事件,Lambda 从 SQS 进行批处理,以应对背压。Saga 模式将 EventBridge 与 Step Functions 结合,实现分布式事务的编排。EventBridge Scheduler 可通过 cron 表达式或速率表达式定时发布事件,用于定期批处理或维护任务的自动化。还支持一次性调度,可应对在未来特定时间发布事件的预约处理。

EventBridge 的定价

EventBridge 的自定义事件每 100 万个事件约 1.00 美元。来自 AWS 服务的事件(EC2 状态变更、S3 对象创建等)免费。Schema Registry 和 Scheduler 的使用不产生额外费用。Pipes 的事件从源到目标的转发每 100 万请求约 0.40 美元。在评估结合 SQS(每 100 万请求约 0.40 美元)或 SNS(约 0.50 美元)的整体事件驱动架构成本时,需要将各服务的费用合计计算。

总结 - 事件驱动架构的导入价值

Amazon EventBridge 作为事件驱动架构的核心,全面支持事件的收集、路由和分发。通过与 Lambda、SQS、Step Functions 的组合,可以无服务器方式实现扇出、缓冲、Saga 等多种模式。对于推进微服务架构松耦合化的组织而言,EventBridge 是最全面的事件总线服务。