¿Cómo puedo detectar y solucionar las excepciones ReadProvisionedThroughputExceded en secuencias de datos de Kinesis?

5 minutos de lectura
0

Se produce un error ReadProvisionedThroughputExceeded en Amazon Kinesis Data Streams y no sé por qué.

Breve descripción

El error ReadProvisionedThroughputExceeded se produce cuando las secuencias de datos de Kinesis limitan las llamadas GetRecords durante cierto tiempo.

Si se superan las siguientes cuotas, se puede limitar la secuencia de datos de Amazon Kinesis:

  • Cada partición admite hasta cinco transacciones de lectura por segundo o cinco llamadas GetRecords por segundo.
  • Cada partición admite una velocidad de lectura máxima de 2 MiB por segundo.
  • GetRecords recupera hasta 10 MiB de datos por llamada desde una única partición y hasta 10 000 registros por llamada. Si una llamada GetRecords devuelve 10 MiB de datos, las llamadas que se realicen en los 5 segundos posteriores provocarán un error.

Si aparece un error ReadProvisionedThroughputExceeded, realice una de las siguientes tareas:

  • Identifique la causa principal del problema.
  • Identifique una posible microrráfaga.
  • Siga las prácticas recomendadas para secuencias de datos de Kinesis.

Solución

Identificación de la causa principal del problema

Para identificar la causa principal del error ReadProvisionedThroughputExceeded en secuencias de datos, monitorice el servicio Amazon Kinesis Data Streams con Amazon CloudWatch.

Revise las siguientes métricas en CloudWatch:

  • GetRecords.Bytes: Número de bytes que se recuperan de la secuencia de datos, medido durante un periodo de tiempo especificado.
  • GetRecords.Records: Número de registros que se recuperan de la secuencia de datos durante un periodo de tiempo especificado.
  • ReadProvisionedThroughputExceeded: Número de llamadas GetRecords que limitan la secuencia de datos.

Configure el panel de CloudWatch para que las estadísticas se muestren como Sum, con el periodo de tiempo establecido en 1 minuto. Luego, divida Sum entre 60 segundos para obtener un valor promedio.

Por ejemplo, si usa el valor de métrica GetRecords.Records, divida Sum entre 60 segundos para calcular el número promedio de registros enviados por segundo. A continuación, compruebe si el valor promedio es inferior a los registros enviados por segundo según el límite establecido para su secuencia de datos. Para obtener más información sobre las cuotas de partición, consulte Quotas and limits.

Nota: Active la característica de supervisión mejorada para asegurarse de que la carga se distribuya uniformemente entre todas las particiones.

También puede usar la métrica GetRecords.Records con las estadísticas visualizadas como SampleCount y el periodo de tiempo establecido en 1 minuto. Divida el valor SampleCount entre 60 segundos para calcular el número promedio de llamadas GetRecords realizadas por segundo para cada partición. Si el valor promedio es de aproximadamente cinco llamadas GetRecords por segundo y se muestra un error ReadProvisionedThroughputExceeded, revise las cuotas de partición y los consumidores. Si los consumidores no superan los límites de partición, el error ReadProvisionedThroughputExceeded podría deberse a que los consumidores realizan más de cinco llamadas GetRecords por segundo.

Por último, compruebe si existe alguna diferencia entre el valor ReadProvisionedThroughputExceeded de las particiones. Si la distribución de las particiones es desigual, o si una partición recibe más o menos datos que otra, se puede producir un desequilibrio en la distribución. Para solucionar este desequilibrio en la distribución de particiones y evitar las particiones activas, utilice UUID como clave de partición en la llamada a la API putRecords.

Identificación de una posible microrráfaga

Aunque es poco frecuente, los valores de las métricas pueden estar por debajo de las cuotas de las particiones y limitar una secuencia de datos durante la lectura.

Por ejemplo, GetRecords.Bytes Sum:1min representa 10 MiB de datos leídos durante 1 minuto. En el segundo 1, la llamada GetRecords.Bytes lee 2 MiB de datos sin ninguna limitación. Luego, en el segundo 2, la llamada GetRecords.Bytes lee 8 MiB de datos. En el segundo 3, es posible que no haya ninguna operación de lectura ni ninguna limitación. Aunque no se alcanza la cuota de partición de un minuto (2 MiB * 60 = 120 MiB de los datos), puede que aparezca un error ReadProvisionedThroughputExceeded. Si observa un pico repentino en los valores de las métricas, busque la microrráfaga que provoca la excepción ReadProvisionedThroughputExceeded.

Seguimiento de las prácticas recomendadas para secuencias de datos de Kinesis

Para mitigar las excepciones ReadProvisionedThroughputExceeded, siga estas prácticas recomendadas:

  • Vuelva a partir la secuencia para incrementar el número de particiones en la secuencia.
  • Reduzca el tamaño de las solicitudes GetRecords. Configure el parámetro del límite o reduzca la frecuencia de las solicitudes GetRecords.
    Nota: Si el consumidor es Amazon Kinesis Data Firehose, la secuencia de datos se ajusta a la frecuencia de las llamadas GetRecords que se realizan. Si el consumidor es una función de AWS Lambda con asignación de orígenes de eventos, la transmisión se sondea una vez por segundo. No puede modificar la frecuencia de sondeo. Si el consumidor es una aplicación de la biblioteca de clientes de Amazon Kinesis (KCL), ajuste la frecuencia de sondeo. Para ajustar la frecuencia de sondeo, modifique el valor del parámetro DEFAULT_IDLETIME_BETWEEN_READS_MILLIS en el archivo KinesisClientLibConfiguration. Puede establecer este valor de forma dinámica en el código. Para obtener más información sobre cómo modificar este valor en la KCL, consulte amazon-kinesis-client en el sitio web de GitHub.
  • Distribuya las operaciones de lectura y escritura de la manera más uniforme posible entre todas las particiones en las secuencias de datos.
  • Si la secuencia de datos utiliza más de cinco consumidores, utilice consumidores con distribución ramificada mejorada
  • Si se producen excepciones ReadProvisionedThroughputExceeded, use el mecanismo de reintento en caso de error y retroceso exponencial en la lógica del consumidor. En el caso de las aplicaciones consumidoras que utilizan un SDK de AWS, las solicitudes se vuelven a intentar de forma predeterminada.
OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año