在 Amazon EventBridge 中使用 PutEvents 发送事件 - Amazon EventBridge
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在 Amazon EventBridge 中使用 PutEvents 发送事件

PutEvents 操作在一次请求中将多个事件发送到 EventBridge。有关更多信息,请参阅 Amazon EventBridge API 引用 中的 PutEventsAmazon CLI 命令引用 中的 put-events

每个 PutEvents 请求可支持有限数目的条目。有关更多信息,请参阅 Amazon EventBridge 配额PutEvents 操作将尝试按请求的自然顺序处理所有条目。调用 PutEvents 后,EventBridge 会为每个事件分配唯一 ID。

以下示例 Java 代码将两个相同的事件发送到 EventBridge。

Amazon SDK for Java Version 2.x
EventBridgeClient eventBridgeClient = EventBridgeClient.builder().build(); PutEventsRequestEntry requestEntry = PutEventsRequestEntry.builder() .resources("resource1", "resource2") .source("com.mycompany.myapp") .detailType("myDetailType") .detail("{ \"key1\": \"value1\", \"key2\": \"value2\" }") .build(); List < PutEventsRequestEntry > requestEntries = new ArrayList < PutEventsRequestEntry > (); requestEntries.add(requestEntry); PutEventsRequest eventsRequest = PutEventsRequest.builder() .entries(requestEntries) .build(); PutEventsResponse result = eventBridgeClient.putEvents(eventsRequest); for (PutEventsResultEntry resultEntry: result.entries()) { if (resultEntry.eventId() != null) { System.out.println("Event Id: " + resultEntry.eventId()); } else { System.out.println("PutEvents failed with Error Code: " + resultEntry.errorCode()); } }
Amazon SDK for Java Version 1.0
EventBridgeClient eventBridgeClient = EventBridgeClient.builder().build(); PutEventsRequestEntry requestEntry = new PutEventsRequestEntry() .withTime(new Date()) .withSource("com.mycompany.myapp") .withDetailType("myDetailType") .withResources("resource1", "resource2") .withDetail("{ \"key1\": \"value1\", \"key2\": \"value2\" }"); PutEventsRequest request = new PutEventsRequest() .withEntries(requestEntry, requestEntry); PutEventsResult result = awsEventsClient.putEvents(request); for (PutEventsResultEntry resultEntry : result.getEntries()) { if (resultEntry.getEventId() != null) { System.out.println("Event Id: " + resultEntry.getEventId()); } else { System.out.println("Injection failed with Error Code: " + resultEntry.getErrorCode()); } }

运行此代码后,PutEvents 结果将包含一组响应条目。响应数组中的每个条目对应请求数组中的一个条目,顺序按请求和响应从开始到结束的顺序。响应 Entries 数组包含的条目数量始终与请求数组相同。

使用 PutEvents 处理故障

默认情况下,如果请求中的个别条目失败,EventBridge 会继续处理请求中的其余条目。响应 Entries 数组可以包括成功条目和不成功条目。您必须删除不成功的条目,并在后续调用中包括它们。

成功的结果条目包含一个 Id 值,不成功的结果条目包括 ErrorCodeErrorMessage 值。ErrorCode 描述错误的类型。ErrorMessage 提供有关错误的更多信息。以下示例包含 PutEvents 请求的三个结果条目。第二个条目不成功。

{ "FailedEntryCount": 1, "Entries": [ { "EventId": "11710aed-b79e-4468-a20b-bb3c0c3b4860" }, { "ErrorCode": "InternalFailure", "ErrorMessage": "Internal Service Failure" }, { "EventId": "d804d26a-88db-4b66-9eaf-9a11c708ae82" } ] }
注意

如果您使用 PutEvents 将事件发布到不存在的事件总线,EventBridge 事件匹配将找不到相应的规则,因此会删除该事件。尽管 EventBridge 会发送 200 响应,但它不会将请求设为失败,也不会将该事件包含在请求响应的 FailedEntryCount 值中。

不成功的条目可包含在后续 PutEvents 请求中。首先,要查找请求中是否存在失败的条目,请检查 PutEventsResult 中的 FailedRecordCount 参数。如果该参数不为零,则可以将每个具有非空值 ErrorCodeEntry 添加到后续请求中。以下示例展示了一个故障处理程序。

PutEventsRequestEntry requestEntry = new PutEventsRequestEntry() .withTime(new Date()) .withSource("com.mycompany.myapp") .withDetailType("myDetailType") .withResources("resource1", "resource2") .withDetail("{ \"key1\": \"value1\", \"key2\": \"value2\" }"); List<PutEventsRequestEntry> putEventsRequestEntryList = new ArrayList<>(); for (int i = 0; i < 3; i++) { putEventsRequestEntryList.add(requestEntry); } PutEventsRequest putEventsRequest = new PutEventsRequest(); putEventsRequest.withEntries(putEventsRequestEntryList); PutEventsResult putEventsResult = awsEventsClient.putEvents(putEventsRequest); while (putEventsResult.getFailedEntryCount() > 0) { final List<PutEventsRequestEntry> failedEntriesList = new ArrayList<>(); final List<PutEventsResultEntry> PutEventsResultEntryList = putEventsResult.getEntries(); for (int i = 0; i < PutEventsResultEntryList.size(); i++) { final PutEventsRequestEntry putEventsRequestEntry = putEventsRequestEntryList.get(i); final PutEventsResultEntry putEventsResultEntry = PutEventsResultEntryList.get(i); if (putEventsResultEntry.getErrorCode() != null) { failedEntriesList.add(putEventsRequestEntry); } } putEventsRequestEntryList = failedEntriesList; putEventsRequest.setEntries(putEventsRequestEntryList); putEventsResult = awsEventsClient.putEvents(putEventsRequest); }

使用 Amazon CLI 发送事件

您可以使用 Amazon CLI 向 EventBridge 发送自定义事件,以便进行处理。以下示例将一个自定义事件放入 EventBridge 中:

aws events put-events \ --entries '[{"Time": "2016-01-14T01:02:03Z", "Source": "com.mycompany.myapp", "Resources": ["resource1", "resource2"], "DetailType": "myDetailType", "Detail": "{ \"key1\": \"value1\", \"key2\": \"value2\" }"}]'

您还可以创建包含自定义事件的 JSON 文件。

[ { "Time": "2016-01-14T01:02:03Z", "Source": "com.mycompany.myapp", "Resources": [ "resource1", "resource2" ], "DetailType": "myDetailType", "Detail": "{ \"key1\": \"value1\", \"key2\": \"value2\" }" } ]

然后,要使用 Amazon CLI 从该文件中读取条目并发送事件,请在命令提示符下键入:

aws events put-events --entries file://entries.json

计算 PutEvents 事件条目大小

使用 PutEvents 操作向 EventBridge 发送自定义事件时,可将多个事件条目批量注入一个请求中,以提高效率。但是,条目总大小必须小于 256KB。您可以在发送事件之前计算条目大小。

注意

已对条目 施加大小限制。即使条目小于大小限制,EventBridge 中的事件 始终大于条目大小,因为事件的 JSON 表示形式有一些必要的字符和键。有关更多信息,请参阅 Amazon EventBridge 中的事件

EventBridge 按如下方式计算 PutEventsRequestEntry 大小:

  • 如果指定,则 Time 参数为 14 字节。

  • SourceDetailType 参数为其 UTF-8 编码形式的字节数。

  • 如果指定,则 Detail 参数为其 UTF-8 编码形式的字节数。

  • 如果指定,则 Resources 参数的每个条目为其 UTF-8 编码形式的字节数。

以下示例 Java 代码计算给定 PutEventsRequestEntry 对象的大小。

int getSize(PutEventsRequestEntry entry) { int size = 0; if (entry.getTime() != null) { size += 14; } size += entry.getSource().getBytes(StandardCharsets.UTF_8).length; size += entry.getDetailType().getBytes(StandardCharsets.UTF_8).length; if (entry.getDetail() != null) { size += entry.getDetail().getBytes(StandardCharsets.UTF_8).length; } if (entry.getResources() != null) { for (String resource : entry.getResources()) { if (resource != null) { size += resource.getBytes(StandardCharsets.UTF_8).length; } } } return size; }
注意

如果条目大小大于 256KB,我们建议将事件上传到 Amazon S3 桶,并在 PutEvents 条目中加入 Object URL