使用 Amazon EventBridge 发送和接收 CloudEvents 计算博客
使用 Amazon EventBridge 发送和接收 CloudEvents
关键要点
事件驱动架构:Amazon EventBridge 帮助开发者轻松构建事件驱动架构 (EDA),通过事件的路由、过滤和转换连接松散耦合的发布者和消费者。CloudEvents 规范:CloudEvents 是一种描述事件数据的开放标准,支持与多种系统和平台的互操作性。不重复解决方案:采用 CloudEvents 标准化事件简化集成,避免冗余信息。API 目标支持:EventBridge 可以使用 API 目标发送 CloudEvents,支持结构化和二进制模式。Amazon EventBridge 使开发者能够构建事件驱动架构 (EDA),通过事件的路由、过滤和转换,将松散耦合的发布者和消费者连接起来。CloudEvents 是一种开源规范,用于以统一的方式描述事件数据。开发者可以直接将 CloudEvents 发布到 EventBridge,利用输入转换器及 API 目标将其发送到后续的 AWS 服务和第三方 API。

概述
事件设计在任何事件驱动架构中都是一个重要的方面。然而,许多开发者在构建架构时常常忽视这一过程,这往往导致不必要的副作用,如暴露实现细节、缺乏标准和版本不兼容等问题。
没有事件标准,系统、代理和组织之间的消息流或事件集成会变得困难。每个系统必须理解事件结构,或者依赖于自定义解决方案来处理版本或验证。
CloudEvents 是一种用于描述事件数据的规范,旨在提供服务、平台和系统之间的互操作性,并且该规范得到了云原生计算基金会 (CNCF) 的支持。CloudEvents 当前作为 CNCF 的毕业项目被许多第三方代理和系统所采用。
使用 CloudEvents 作为描述事件的标准格式,使得集成变得更加简单,您可以使用开源工具帮助构建事件驱动的架构,确保未来的集成保持兼容性。EventBridge 可以基于通用元数据路由和过滤 CloudEvents,而无需理解事件本身的业务逻辑。
CloudEvents 支持两种实现模式:结构化模式和二进制模式,并且支持包括 HTTP、MQTT、AMQP 和 Kafka 在内的多种协议。当将事件发布到 EventBridge 总线时,您可以将事件结构化为 CloudEvents,并将其路由到下游消费者。同时,可以利用输入转换器将任何事件转换为 CloudEvents 规范。事件还可以通过 EventBridge API 目标转发到公共 API,这支持结构化和二进制模式编码,提高了与外部系统的互操作性。
使用 Amazon EventBridge 标准化事件
当将事件发布到 EventBridge 总线时,EventBridge 使用其自己的事件封装,并将事件表示为 JSON 对象。EventBridge 需要定义顶级字段,例如 detailtype 和 source。您可以在 detail 字段内使用任何事件/有效负载。
以下示例显示了来自 ordersservice 的不按标准格式的 OrderPlaced 事件。事件内的 data 包含 orderid、customerid 和 ordertotal。
json{ version 0 id dbc1c73ac51d0c0eca61ab9278974c57 account 1234567890 time 20230523T113846Z region useast1 detailtype OrderPlaced source myappordersservice resources [] detail { data { orderid c172a9843ae543dc8c3fbe080141845a customerid dda98122b5114aaf946577ca4a115ee6 ordertotal 12000 } }}
发布者还可以选择在 detail 字段中添加一个额外的 metadata 字段,以帮助定义事件的标准集。
json{ version 0 id dbc1c73ac51d0c0eca61ab9278974c58 account 1234567890 time 20230523T123846Z region useast1 detailtype OrderPlaced source myappordersservice resources [] detail { metadata { idempotencykey 29d2b068f9c742a091e35ba515de5dbe correlationid dddd9340135ac8c695c241fb8f492222 domain ORDERS time 1707908605 } data { orderid c172a9843ae543dc8c3fbe080141845a customerid dda98122b5114aaf946577ca4a115ee6 ordertotal 12000 } }}
这额外的事件信息有助于下游消费者,改善调试,并管理幂等性。虽然这种方法提供了实用的好处,但它重复了 CloudEvents 规范已经解决的方案。
使用 Amazon EventBridge 发布 CloudEvents
在将事件发布到 EventBridge 时,您可以使用 CloudEvents 的 结构化模式。结构化模式消息是指整个事件属性和数据按照特定事件格式编码在消息体中。二进制模式消息则是事件数据存储在消息体中,事件属性作为消息元数据的一部分。
CloudEvents 有一系列的必填字段,但也提供了对可选属性和扩展的灵活性。CloudEvents 还为实现幂等性提供了解决方案,要求 id 和 source 的组合必须唯一标识一个事件,这可以用作下游实现中的幂等性键。
json{ version 0 id dbc1c73ac51d0c0eca61ab9278974c58 account 1234567890 time 20230523T123846Z region useast1 detailtype OrderPlaced source myappordersservice resources [] detail { specversion 10 id bba4379fb7644d909fb29f572b2b0b61 source myappordersservice type OrderPlaced data { orderid c172a9843ae543dc8c3fbe080141845a customerid dda98122b5114aaf946577ca4a115ee6 ordertotal 12000 } time 20240101T173100Z dataschema https//uswest2consoleawsamazoncom/events/homeregion=uswest2#/registries/discoveredschemas/schemas/myappordersservice40OrderPlaced correlationid dddd9340135ac8c695c241fb8f492222 domain ORDERS }}
通过包含必填字段,OrderPlaced 事件现已符合 CloudEvents 规范。事件还包含可选和扩展字段以提供更多信息。可选字段如 dataschema 对于代理和消费者检索已发布事件模式的 URI 路径非常有用。该示例事件引用了 EventBridge 模式注册表中的模式,因此下游消费者可以获取该模式以验证有效负载。
使用输入转换器将现有事件映射到 CloudEvents
在 EventBridge 中定义目标时,输入转换器允许您在事件到达其目的地之前修改事件。输入转换器是针对每个目标配置的,允许您在下游消费者需要 CloudEvents 格式且希望避免信息重复时对事件进行转换。
输入转换器允许您将 EventBridge 字段,如 id、region、detailtype 和 source,映射到相应的 CloudEvents 属性中。
以下示例显示了如何使用输入转换器将任何 EventBridge 事件转换为 CloudEvents 格式,以便目标接收所需的结构。
json{ version 0 id dbc1c73ac51d0c0eca61ab9278974c58 account 1234567890 time 20240123T123846Z region useast1 detailtype OrderPlaced source myappordersservice resources [] detail { orderid c172a9843ae543dc8c3fbe080141845a customerid dda98122b5114aaf946577ca4a115ee6 ordertotal 12000 }}
使用此输入转换器和输入模板,EventBridge 将事件模式转换为 CloudEvents 规范,以便下游消费者接收。
CloudEvents 输入转换器:
json{ id id source source type detailtype time time data detail}
CloudEvents 输入模板:
json{ specversion 10 id ltidgt source ltsourcegt type lttypegt time lttimegt data ltdatagt}
以下示例显示了下游目标收到的事件有效负载,该有效负载映射到 CloudEvents 规范。
json{ specversion 10 id dbc1c73ac51d0c0eca61ab9278974c58 source myappordersservice type OrderPlaced time 20240123T123846Z data { orderid c172a9843ae543dc8c3fbe080141845a customerid dda98122b5114aaf946577ca4a115ee6 ordertotal 12000 }}
有关如何使用 CloudEvents 的输入转换器的更多信息,请参阅 Serverless Land 的模式。
使用 API 目标将事件转换为 CloudEvents
EventBridge API 目标 允许您在匹配规则的基础上触发 HTTP 端点,结合公共 API 与第三方系统进行集成。您可以通过使用输入转换器和自定义 HTTP 头将事件路由到支持 CloudEvents 格式的 API,从而将 EventBridge 事件转换为 CloudEvents。API 目标现在支持自定义 contenttype 头,允许您将结构化或二进制 CloudEvents 发送给下游消费者。
通过 API 目标发送二进制 CloudEvents
在通过 HTTP 发送二进制 CloudEvents 时,您必须使用 HTTP 绑定规范,并设置必要的 CloudEvents 头。这些头告诉下游消费者传入有效负载使用 CloudEvents 格式。请求的主体即为事件本身。
CloudEvents 的头以 ce 为前缀。可以在 HTTP 协议绑定文档中找到头的列表。
以下示例显示了二进制事件的头:
httpPOST /order HTTP/11 Host webhookexamplecomcespecversion 10cetype OrderPlacedcesource myappordersserviceceid bba4379fb7644d909fb29f572b2b0b61cetime 20240101T173100Zcedataschema https//uswest2consoleawsamazoncom/events/homeregion=uswest2#/registries/discoveredschemas/schemas/myappordersservice40OrderPlacedcorrelationid dddd9340135ac8c695c241fb8f492222domain ORDERSContentType application/json charset=utf8
以下示例显示了二进制事件的主体:
json{ orderid c172a9843ae543dc8c3fbe080141845a customerid dda98122b5114aaf946577ca4a115ee6 ordertotal 12000}
有关在使用 API 目标时使用二进制 CloudEvents 的更多信息,请查阅 Serverless Land 上的模式。
通过 API 目标发送结构化 CloudEvents
要支持 CloudEvents 的结构化模式,您必须将 contenttype 指定为 application/cloudeventsjson charset=UTF8,这使 API 消费者知道事件有效负载符合 CloudEvents 规范。
飞驰加速器免费永久版httpPOST /order HTTP/11Host webhookexamplecom
ContentType application/cloudeventsjson charset=utf8{ specversion 10 id bba4379fb7644d909fb29f572b2b0b61 source myappordersservice type OrderPlaced data { orderid c172a9843ae543dc8c3fbe080141845a customerid dda98122b5114aaf946577ca4a115ee6 ordertotal 12000 } time 20240101T173100Z dataschema https//uswest2consoleawsamazoncom/events/homeregion=uswest2#/registries/discoveredschemas/schemas/myappordersservice40OrderPlaced correlationid dddd9340135ac8c695c241fb8f492222 domainORDERS}
结论
精心设计事件在构建事件驱动架构时起着重要作用,有助于有效集成生产者和消费者。开放源代码的 CloudEvents 规范帮助开发者标准化集成过程,简化内部系统与外部合作伙伴之间的交互。
EventBridge 允许您在事件的 detail 属性中使用灵活的有效负载结构来标准化事件。您可以直接将结构化的 CloudEvents 发布到事件总线的 detail 字段,并使用有效负载转换使下游消费者能够以 CloudEvents 格式接收事件。
EventBridge 通过 API 目标简化与第三方系统的集成。利用新自定义的 contenttype 头和输入转换器修改事件结构,您可以发送结构化或二进制 CloudEvents,以与公共 API 集成。
要获取更多无服务器学习资源,请访问 Serverless Land。
标签:serverless