¿Qué se debe hacer cuando se excede el rendimiento provisto?

Estoy usando AWS SDK para Javascript (Node.js) para leer datos de una tabla de DynamoDB. La función de escalado automático hace un gran trabajo durante la mayor parte del tiempo y las unidades de capacidad de lectura (RCU) consumidas son realmente bajas la mayor parte del día. Sin embargo, hay un trabajo progtwigdo que se ejecuta alrededor de la medianoche que consume aproximadamente 10 veces la RCU aprovisionada y, dado que el escalado automático toma algún tiempo para ajustar la capacidad, hay muchas solicitudes de lectura limitadas. Además, sospecho que mis solicitudes no se están completando (aunque no puedo encontrar ninguna excepción en mi registro de errores).

Para manejar esta situación, he considerado boost la RCU aprovisionada utilizando la API de AWS ( updateTable ), pero calcular la cantidad de RCU que mi aplicación necesita puede no ser sencillo.

Así que mi segunda suposición fue volver a intentar las solicitudes fallidas y simplemente esperar a que la escala automática aumente la RCU aprovisionada. Como lo señalaron los documentos de AWS y algunas respuestas de desbordamiento de stack (en particular sobre ProvisionedThroughputExceededException ):

Los SDK de AWS para Amazon DynamoDB reintentan automáticamente las solicitudes que reciben esta excepción. Por lo tanto, su solicitud finalmente será exitosa, a menos que la solicitud sea demasiado grande o su cola de rebashs sea demasiado grande para finalizar.

He leído preguntas similares ( esta , esta y esta ) pero todavía estoy confundido: ¿se produce esta excepción si la solicitud es demasiado grande o la cola de rebashs es demasiado grande para terminar (por lo tanto, después de los rebashs automáticos) o en realidad antes de los rebashs?

Lo más importante: ¿ es la excepción que debería estar esperando en mi contexto? (¿Para poder atraparlo y volver a intentarlo hasta que la escala automática aumente la RCU?)

Sí.

Cada vez que su aplicación envía una solicitud que excede su capacidad, recibe un mensaje de ProvisionedThroughputExceededException de Dynamo. Sin embargo, su SDK maneja esto por usted y reintenta. El tiempo predeterminado de rebash del Dynamo comienza a 50 ms, el número predeterminado de rebashs es 10 y el retroceso es exponencial por defecto.

Esto significa que obtienes rebashs en:

  • 50ms
  • 100ms
  • 200ms
  • 400ms
  • 800ms
  • 1.6s
  • 3.2s
  • 6.4s
  • 12.8s
  • 25.6s

Si después de que el décimo rebash su solicitud aún no haya tenido éxito, el SDK pasará de vuelta a la aplicación ProvisionedThroughputExceededException y podrá manejarlo como desee.

Puede manejarlo aumentando la provisión de rendimiento, pero otra opción sería cambiar los tiempos de rebash predeterminados cuando cree la conexión Dynamo. Por ejemplo

new AWS.DynamoDB({maxRetries: 13, retryDelayOptions: {base: 200}}); 

Esto significaría que vuelva a intentarlo 13 veces, con un retraso inicial de 200 ms. Esto daría a su solicitud un total de 819.2s para completar en lugar de 25.6s.