Como detectar e solucionar problemas de exceções ReadProvisionedThroughputExceeded no Kinesis Data Streams?

5 minuto de leitura
0

Recebo um erro ReadProvisionedThroughputExceeded no Amazon Kinesis Data Streams e não sei por que isso está acontecendo.

Breve descrição

O erro ReadProvisionedThroughputExceeded ocorre quando o Kinesis Data Streams exerce controle de utilização das chamadas GetRecords por um período de tempo.

Se as cotas a seguir forem excedidas, seu fluxo de dados do Amazon Kinesis poderá sofrer controle de utilização:

  • Cada fragmento suporta até cinco transações de leitura por segundo ou cinco chamadas GetRecords por segundo para cada fragmento.
  • Cada fragmento suporta uma taxa máxima de leitura de 2 MiB por segundo.
  • O GetRecords recupera até 10 MiB de dados por chamada de um único fragmento e até 10.000 registros por chamada. Se uma chamada para GetRecords retornar 10 MiB de dados, as chamadas subsequentes feitas nos próximos 5 segundos resultarão em erro.

Se você receber um erro ReadProvisionedThroughputExceeded, conclua uma das seguintes tarefas:

  • Identifique a causa raiz do problema.
  • Identifique um possível micropico de tráfego.
  • Siga as melhores práticas do Kinesis Data Streams.

Resolução

Identifique a causa raiz do problema

Para identificar a causa raiz do erro ReadProvisionedThroughputExceeded em fluxos de dados, monitore o serviço do Amazon Kinesis Data Streams com o Amazon CloudWatch.

Analise as seguintes métricas no CloudWatch:

  • GetRecords.Bytes: o número de bytes recuperados do fluxo de dados, medido em um período de tempo especificado.
  • GetRecords.Records: o número de registros recuperados do fluxo de dados em um período de tempo especificado.
  • ReadProvisionedThroughputExceeded: o número de chamadas GetRecords sofrendo controle de utilização no fluxo de dados.

Configure seu painel do CloudWatch para exibir as estatísticas como uma Soma com o intervalo de tempo definido como 1 minuto. Depois, divida a Soma por 60 segundos para obter um valor médio.

Por exemplo, se usar o valor da métrica GetRecords.Records, divida Soma por 60 segundos para calcular o número médio de registros enviados por segundo. Depois, verifique se o valor médio é inferior aos registros enviados por segundo para o limite definido para seu fluxo de dados. Para mais informações sobre cotas de fragmentos, consulte Quotas and limits.

Observação: ative o atributo de monitoramento avançado para garantir que a carga seja distribuída uniformemente entre todos os fragmentos.

Também é possível usar a métrica GetRecords.Records com a estatística visualizada como SampleCount e o período definido como 1 minuto. Divida o valor de SampleCount por 60 segundos para calcular o número médio de chamadas GetRecords feitas por segundo para cada fragmento. Se o valor médio for de aproximadamente cinco chamadas GetRecords por segundo e você receber um erro ReadProvisionedThroughputExceeded, analise seus consumidores e cotas de fragmentos. Se os consumidores não excederem os limites de fragmentos, o erro ReadProvisionedThroughputExceeded pode estar ocorrendo porque seus consumidores estão fazendo mais de cinco chamadas GetRecords por segundo.

Por fim, verifique se há uma diferença entre o valor de ReadProvisionedThroughputExceeded dos seus fragmentos. Se a distribuição dos fragmentos for desigual ou se um fragmento receber mais ou menos dados que outro, poderá ocorrer um desequilíbrio na distribuição. Para solucionar esse desequilíbrio na distribuição de fragmentos e evitar fragmentos ativos, use o UUID como chave de partição na chamada de API putRecords.

Identifique um possível micropico de tráfego

Embora raros, os valores métricos podem estar abaixo das cotas de fragmentos e fazer com que um fluxo de dados sofra controle de utilização durante uma leitura.

Por exemplo, um GetRecords.Bytes Sum:1min representa 10 MiB de dados lidos por 1 minuto. Em 1 segundo, a chamada GetRecords.Bytes lê 2 MiB de dados sem qualquer controle de utilização. Em seguida, em 2 segundos, a chamada GetRecords.Bytes lê 8 MiB de dados. Em 3 segundos, talvez não haja nenhuma operação de leitura ou controle de utilização. Embora a cota de fragmentos do minuto não tenha sido atingida (2 MiB * 60 = 120 MiB de dados), você pode receber um erro ReadProvisionedThroughputExceeded. Se você notar um aumento repentino nos valores da métrica, procure o micropico de tráfego que está causando a exceção ReadProvisionedThroughputExceeded.

Siga as melhores práticas do Kinesis Data Streams

Para reduzir as exceções ReadProvisionedThroughputExceeded, siga as melhores práticas a seguir:

  • Refragmente seu fluxo para aumentar o número de fragmentos nele.
  • Reduza o tamanho das solicitações GetRecords. Configure o parâmetro de limite ou reduza a frequência das solicitações GetRecords.
    Observação: se o consumidor for o Amazon Kinesis Data Firehose, o fluxo de dados se ajustará à frequência das chamadas GetRecords realizadas. Se o consumidor for uma função do AWS Lambda com mapeamento de origem do evento, o fluxo será pesquisado uma vez a cada segundo. Você não pode modificar a frequência da pesquisa. Se o consumidor for uma aplicação da Amazon Kinesis Client Library (KCL), ajuste a frequência da pesquisa. Para ajustar a frequência da pesquisa, modifique o valor do parâmetro DEFAULT_IDLETIME_BETWEEN_READS_MILLIS no arquivo KinesisClientLibConfiguration. Você pode definir dinamicamente esse valor no código. Para obter mais informações sobre como modificar esse valor na KCL, consulte amazon-kinesis-client no site do GitHub.
  • Distribua as operações de leitura e gravação da forma mais uniforme possível entre todos os fragmentos nos fluxos de dados.
  • Se seu fluxo de dados usa mais de cinco consumidores, use consumidores com distribuição aprimorada.
  • Se você encontrar exceções ReadProvisionedThroughputExceeded, use um mecanismo de novas tentativas de erro e recuo exponencial na lógica do consumidor. Para aplicações do consumidor que usem um SDK da AWS, as solicitações são repetidas por padrão.
AWS OFICIAL
AWS OFICIALAtualizada há um ano