Gestionar el tiempo de espera de visibilidad y las nuevas entregas

AWSBeginner
Practicar Ahora

Introducción

Un procesador recibe un trabajo de pedido, pero se detiene antes de confirmarlo. Observarás cómo vuelve el mismo trabajo, darás más tiempo de procesamiento a su siguiente entrega y comprobarás el pedido real antes de la confirmación.

Completa primero Enviar y consumir trabajos con SQS. Esta VM independiente proporciona su propio procesador, tablas y datos de referencia; no se reutilizan colas, mensajes ni identificadores de recepción anteriores.

Relación con las certificaciones

Este laboratorio ofrece práctica para los siguientes temas de examen.

Preparar un trabajo para una nueva entrega

En este paso, crea una cola con un tiempo de espera de visibilidad predeterminado corto y envía un trabajo sin procesarlo.

Usa AWS View junto a Terminal para comparar las colas actuales, los resultados del procesador y los pedidos almacenados. Conserva los datos de referencia ajenos al trabajo.

Trabaja en el directorio del proyecto preparado:

cd /home/labex/project

Crea una cola Standard. Su tiempo de espera de visibilidad predeterminado es de 30 segundos y se usa cuando una solicitud de recepción no especifica otro valor. $(...) guarda la dirección de cola seleccionada para comandos posteriores.

QUEUE_URL=$(aws sqs create-queue --queue-name labex-q02-jobs --attributes VisibilityTimeout=30 --query QueueUrl --output text)

Envía un trabajo JSON:

aws sqs send-message --queue-url "$QUEUE_URL" --message-body '{"id":"redelivery-order","quantity":3}'

Lee el tiempo de espera predeterminado y los recuentos:

aws sqs get-queue-attributes --queue-url "$QUEUE_URL" --attribute-names VisibilityTimeout ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible

Espera el tiempo de espera 30, un mensaje disponible y cero mensajes en curso. En AWS View, el trabajo tiene un recuento de recepciones de cero, la función Lambda proporcionada no tiene ejecuciones y no hay ningún pedido almacenado. El envío acepta el trabajo en la cola; no lo procesa.

Observar el vencimiento y una segunda entrega

En este paso, recibe un trabajo, déjalo sin confirmar y observa una segunda entrega después de que venza su visibilidad.

un mensaje y dos entregas

Después de que venza la visibilidad, el mismo mensaje puede entregarse de nuevo con un identificador de recepción nuevo.

El siguiente bloque de comandos es un experimento temporizado. Léelo antes de ejecutarlo. La primera recepción sustituye la visibilidad por 10 segundos; la segunda recepción inmediata no debe encontrar nada mientras ese trabajo está oculto. sleep 12 espera a que pase el plazo. La recepción final da al trabajo que vuelve una ventana de 120 segundos para que puedas inspeccionarlo sin apresurarte por el tiempo de espera corto. Cada > guarda una respuesta JSON en un archivo distinto.

aws sqs receive-message --queue-url "$QUEUE_URL" --max-number-of-messages 1 --visibility-timeout 10 --message-system-attribute-names ApproximateReceiveCount --output json > first-delivery.json
aws sqs receive-message --queue-url "$QUEUE_URL" --max-number-of-messages 1 --wait-time-seconds 0 --output json > while-hidden.json
sleep 12
aws sqs receive-message --queue-url "$QUEUE_URL" --max-number-of-messages 1 --visibility-timeout 120 --message-system-attribute-names ApproximateReceiveCount --output json > second-delivery.json

La recepción vacía no procesa ni elimina nada. Muestra esa respuesta:

cat while-hidden.json

Espera una respuesta vacía sin Messages. jq -s lee las dos respuestas guardadas juntas: .[0] es la primera entrega y .[1] es la segunda. Compara la identidad del mensaje y el identificador de la entrega sin imprimir los identificadores de recepción:

jq -s '{
  same_message: (.[0].Messages[0].MessageId == .[1].Messages[0].MessageId),
  new_receipt: (.[0].Messages[0].ReceiptHandle != .[1].Messages[0].ReceiptHandle),
  receive_count: .[1].Messages[0].Attributes.ApproximateReceiveCount
}' first-delivery.json second-delivery.json

Espera que same_message y new_receipt sean true, con el recuento de recepciones "2". Un ID de mensaje identifica el mensaje en cola entre intentos. Un identificador de recepción identifica un intento de entrega, por lo que debes usar siempre el más reciente para cambiar la visibilidad y eliminar el mensaje.

AWS View muestra el mismo cuerpo en curso, recibido dos veces, sin pedido todavía. Esta es una nueva entrega real después de un intento sin confirmar. No fue necesario un segundo envío. Las colas Standard también pueden entregar duplicados por otros motivos; gestionar la visibilidad no proporciona procesamiento exactamente una vez.

Ejemplo de AWS View: el mismo trabajo está en curso tras su segunda entrega, sin pedido almacenado todavía

Este ejemplo real muestra un recuento de recepciones de dos antes del procesamiento de negocio. Los identificadores de mensajes difieren entre entornos de trabajo.

Ampliar la ventana y terminar el trabajo

En este paso, amplía la ventana de procesamiento de la entrega actual, completa el procesador proporcionado y confirma únicamente después de verificar los datos almacenados.

Selecciona el identificador de recepción más reciente de la segunda respuesta. jq -r escribe una cadena sin formato adecuada para el argumento del comando.

RECEIPT_HANDLE=$(jq -r '.Messages[0].ReceiptHandle' second-delivery.json)

Cambia la visibilidad de esta entrega concreta a 300 segundos:

aws sqs change-message-visibility --queue-url "$QUEUE_URL" --receipt-handle "$RECEIPT_HANDLE" --visibility-timeout 300

Este nuevo intervalo comienza cuando el cambio se realiza correctamente. Mantiene sin cambios el ajuste predeterminado de 30 segundos de la cola y no confirma el trabajo. Si la ventana de inspección de 120 segundos ya venció, vuelve a recibir el trabajo en second-delivery.json y selecciona su identificador más reciente antes de cambiar la visibilidad. Los intentos adicionales incrementan el recuento de recepciones; vuelve a usar el experimento temporizado en un entorno de trabajo nuevo si necesitas repetir su observación exacta de dos entregas.

Convierte el cuerpo recibido de texto JSON a un objeto de trabajo:

jq '.Messages[0].Body | fromjson' second-delivery.json > job.json

Ejecuta la función Lambda proporcionada e inspecciona su resultado:

aws lambda invoke --function-name labex-q02-worker --payload fileb://job.json worker-response.json
cat worker-response.json

Espera processed: true, la cantidad 3 y un total de 850 céntimos. Lee el elemento persistido de forma independiente:

aws dynamodb get-item --table-name labex-q02-orders --key '{"id":{"S":"redelivery-order"}}' --consistent-read --query Item

Solo después de confirmar el resultado real almacenado, elimina el mensaje con el identificador de recepción actual:

aws sqs delete-message --queue-url "$QUEUE_URL" --receipt-handle "$RECEIPT_HANDLE"
aws sqs get-queue-attributes --queue-url "$QUEUE_URL" --attribute-names VisibilityTimeout ApproximateNumberOfMessages ApproximateNumberOfMessagesNotVisible

Espera el tiempo de espera predeterminado 30, cero mensajes disponibles y cero en curso. AWS View muestra una cola vacía, la entrada y el resultado reales del procesador y el pedido redelivery-order/3/850. Ampliar la visibilidad redujo la posibilidad de que otro procesador recibiera el trabajo mientras este intento estaba procesándolo. No hizo idempotente la acción de negocio; las unidades posteriores enseñan una protección duradera contra efectos duplicados.

Eliminar la cola y el resultado propio

En este paso, elimina tu cola, tu pedido y tus registros de ejecución, conservando los recursos preparados y los datos de referencia proporcionados.

aws sqs delete-queue --queue-url "$QUEUE_URL"
aws dynamodb delete-item --table-name labex-q02-orders --key '{"id":{"S":"redelivery-order"}}'
aws logs delete-log-group --log-group-name /aws/lambda/labex-q02-worker

Usa consultas correctas a los servicios para confirmar la ausencia y la disponibilidad de la referencia:

aws sqs list-queues
aws dynamodb scan --table-name labex-q02-orders --query Items
aws dynamodb scan --table-name labex-q02-reference --query Items

No queda ninguna URL de cola ni elemento de pedido. El elemento de referencia todavía indica keep unchanged. AWS View muestra el mismo estado de limpieza y el procesador proporcionado sigue disponible. Los errores de red o autenticación no pueden demostrar la eliminación.

Elimina los archivos locales de entregas y respuestas:

rm -f first-delivery.json while-hidden.json second-delivery.json job.json worker-response.json

Ejecuta la comprobación del paso antes de finalizar tu entorno.

Resumen

Observaste cómo un trabajo SQS sin confirmar volvía a estar disponible tras el vencimiento de su visibilidad, recibiste el mismo mensaje con un identificador de recepción nuevo y un recuento de recepciones mayor, y ampliaste el tiempo de procesamiento de la entrega actual. Verificaste un pedido real almacenado antes de la confirmación y eliminaste tu cola, tu resultado y tus registros, conservando los recursos proporcionados.