Envio de eventos com PutEvents a Amazon EventBridge - Amazon EventBridge

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Envio de eventos com PutEvents a Amazon EventBridge

A PutEvents ação envia vários eventos EventBridge em uma única solicitação. Para obter mais informações, consulte PutEventsna Amazon EventBridge API Reference e put-events na AWS CLI Command Reference.

Cada solicitação PutEvents pode oferecer suporte a um número limitado de entradas. Para ter mais informações, consulte EventBridge Cotas da Amazon. A operação PutEvents tenta processar todas as entradas na ordem natural da solicitação. Depois de ligarPutEvents, EventBridge atribua a cada evento uma ID exclusiva.

O exemplo de código Java a seguir envia dois eventos idênticos para EventBridge.

AWS 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()); } }
AWS 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()); } }

Depois de executar esse código, o resultado PutEvents inclui uma matriz de entradas de resposta. Cada entrada na matriz de resposta corresponde diretamente com uma entrada na matriz em ordem, do início ao fim da solicitação e da resposta. A matriz Entries de resposta sempre inclui o mesmo número de entradas que a solicitação.

Como lidar com falhas com PutEvents

Por padrão, se uma entrada individual em uma solicitação falhar, EventBridge continuará processando o restante das entradas na solicitação. Uma matriz Entries de respostas pode incluir entradas com e sem êxito. É preciso detectar entradas processadas sem êxito e incluí-las em uma chamada subsequente.

As entradas de resultados com êxito incluem um valor Id, e as entradas de resultados sem êxito incluem valores ErrorCode e ErrorMessage. ErrorCodedescreve o tipo de erro. ErrorMessage fornece mais informações sobre o erro. O exemplo a seguir tem três entradas de resultado de uma solicitação PutEvents. A segunda entrada não teve êxito.

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

Se você costuma PutEvents publicar um evento em um barramento de eventos que não existe, a correspondência de EventBridge eventos não encontrará uma regra correspondente e cancelará o evento. Embora EventBridge envie uma 200 resposta, ela não falhará na solicitação nem incluirá o evento no FailedEntryCount valor da resposta da solicitação.

É possível incluir as entradas que foram processadas sem êxito nas solicitações PutEvents subsequentes. Primeiro, para descobrir se há entradas com falha na solicitação, verifique o parâmetro FailedRecordCount em PutEventsResult. Se não for zero, cada Entry tenha um ErrorCode poderá ser adicionada, que não seja nula a uma solicitação subsequente. O exemplo a seguir mostra um manipulador com falha.

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); }

Enviando eventos usando o AWS CLI

Você pode usar o AWS CLI para enviar eventos personalizados para EventBridge que eles possam ser processados. O exemplo a seguir coloca um evento personalizado em 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\" }"}]'

Você também pode criar um JSON arquivo que contenha eventos personalizados.

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

Em seguida, para usar o AWS CLI para ler as entradas desse arquivo e enviar eventos, em um prompt de comando, digite:

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

Calculando o tamanho da entrada do PutEvents evento

Ao enviar eventos personalizados para EventBridge usar a PutEvents ação, você pode agrupar várias entradas de eventos em uma solicitação de eficiência. No entanto, o tamanho total da entrada deve ser menor que 256 KB. Também é possível calcular o tamanho da entrada antes de enviar os eventos.

nota

O limite de tamanho é imposto na entrada. Mesmo que a entrada seja menor que o limite de tamanho, o evento em EventBridge é sempre maior que o tamanho da entrada devido aos caracteres e chaves necessários para a JSON representação do evento. Para ter mais informações, consulte Eventos na Amazon EventBridge.

EventBridge calcula o PutEventsRequestEntry tamanho da seguinte forma:

  • Se o parâmetro Time for especificado, ele será medido como 14 bytes.

  • Os DetailType parâmetros Source e são o número de bytes para seus formulários codificados UTF em -8.

  • Se especificado, o Detail parâmetro é o número de bytes para seu formato codificado em UTF -8.

  • Se especificado, cada entrada do Resources parâmetro é o número de bytes para seus formulários codificados em UTF -8.

O código em Java de exemplo a seguir calcula o tamanho de um determinado objeto 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; }
nota

Se o tamanho da entrada for maior que 256 KB, recomendamos fazer o upload do evento em um bucket do Amazon S3 e incluindo o Object URL na entrada PutEvents.