Após o reestilhaçamento - Amazon Kinesis Data Streams

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á.

Após o reestilhaçamento

Após qualquer tipo de procedimento de refragmentação no Amazon Kinesis Data Streams e antes de retomar o processamento normal de registros, é necessário realizar outros procedimentos e fazer algumas considerações. As seções a seguir descrevem esses itens.

Aguardar um stream ficar ativo novamente

Depois de chamar uma operação de reestilhaçamento, splitShard ou mergeShards, você precisa esperar o stream ficar ativo novamente. O código a ser usado é o mesmo de quando você espera que um streaming se torne ativo após a criação de um streaming. Esse código é o seguinte:

DescribeStreamRequest describeStreamRequest = new DescribeStreamRequest(); describeStreamRequest.setStreamName( myStreamName ); long startTime = System.currentTimeMillis(); long endTime = startTime + ( 10 * 60 * 1000 ); while ( System.currentTimeMillis() < endTime ) { try { Thread.sleep(20 * 1000); } catch ( Exception e ) {} try { DescribeStreamResult describeStreamResponse = client.describeStream( describeStreamRequest ); String streamStatus = describeStreamResponse.getStreamDescription().getStreamStatus(); if ( streamStatus.equals( "ACTIVE" ) ) { break; } // // sleep for one second // try { Thread.sleep( 1000 ); } catch ( Exception e ) {} } catch ( ResourceNotFoundException e ) {} } if ( System.currentTimeMillis() >= endTime ) { throw new RuntimeException( "Stream " + myStreamName + " never went active" ); }

Roteamento de dados, persistência de dados e estado do estilhaço após um reestilhaçamento

Como o Kinesis Data Streams é um serviço de streaming de dados em tempo real, suas aplicações devem pressupor que os dados fluem continuamente pelos fragmentos do fluxo. Quando você reestilhaça, os registros de dados que estavam fluindo para os estilhaços pais são re-roteados para fluírem para os estilhaços filhos com base nos valores de chave de hash para as quais são mapeadas as chaves de partição de registro de dados. No entanto, os registros de dados que estavam nos estilhaços pais antes do reestilhaçamento permanecem nesses estilhaços. Em outras palavras, os estilhaços pais não desaparecem quando o reestilhaçamento ocorre. Eles persistem com os dados que continham antes do reestilhaçamento. Os registros de dados nos fragmentos pai podem ser acessados usando as operações getShardIterator e getRecords na API do Kinesis Data Streams ou por meio da Kinesis Client Library.

nota

Os registros de dados podem ser acessados a partir do momento em que são adicionados ao stream até o período de retenção atual. Isso é verdadeiro independentemente de quaisquer alterações aos estilhaços no stream durante esse período. Para obter mais informações sobre o período de retenção de um stream, consulte Alterar o período de retenção de dados.

No processo de reestilhaçamento, um estilhaço pai passa de um estado OPEN para um estado CLOSED para um estado EXPIRED.

  • OPEN: antes de uma operação de reestilhaçamento, um estilhaço pai está no estado OPEN, o que significa que os registros de dados podem ser adicionados ao estilhaço e recuperados do estilhaço.

  • CLOSED: após uma operação de reestilhaçamento, o estilhaço pai passa para um estado CLOSED. Isso significa que os registros de dados não são mais adicionados ao estilhaço. Os registros de dados que foram adicionados a esse estilhaço agora são adicionados a um estilhaço filho. No entanto, os registros de dados ainda podem ser recuperados do estilhaço por tempo limitado.

  • EXPIRED: após a expiração do período de retenção do streaming, todos os registros de dados no estilhaço pai expiraram e não estão mais acessíveis. Neste momento, o próprio estilhaço muda para um estado EXPIRED. As chamadas a getStreamDescription().getShards para enumerar os estilhaços no stream não incluem os estilhaços EXPIRED na lista de estilhaços retornados. Para obter mais informações sobre o período de retenção de um stream, consulte Alterar o período de retenção de dados.

Depois que o reestilhaçamento ocorreu e o stream está novamente em um estado ACTIVE, você pode iniciar imediatamente a ler dados dos estilhaços filhos. No entanto, os estilhaços pais que permanecem após o reestilhaçamento ainda podem conter dados que ainda não foram lidos e foram adicionados ao stream antes do reestilhaçamento. Se você ler dados de estilhaços filhos antes ler todos os dados dos estilhaços pais, poderá ler dados de uma determinada chave de hash fora da ordem determinada pelos números sequenciais dos registros de dados. Portanto, pressupondo que a ordem dos dados é importante, você deve, após um reestilhaçamento, sempre continuar lendo dados dos estilhaços pais até esgotá-los. Só depois você deverá começar a ler dados dos estilhaços filhos. Quando getRecordsResult.getNextShardIterator retorna null, indica que você leu todos os dados no estilhaço pai. Quando você lê dados usando a Kinesis Client Library, a biblioteca garante o recebimento dos dados em ordem, mesmo quando ocorre uma refragmentação.