Como detectar e solucionar problemas de exceções ReadProvisionedThroughputExceeded no Kinesis Data Streams?
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.
Conteúdo relevante
- AWS OFICIALAtualizada há um ano
- AWS OFICIALAtualizada há 6 meses
- AWS OFICIALAtualizada há um ano
- AWS OFICIALAtualizada há um ano