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.
- Solutions Architect – Associate (SAA-C03) · Tarea 2.1: Tiempos de visibilidad SQS, reentrega e identificadores de recepción.
- Developer – Associate (DVA-C02) · Tarea 1.1: Tiempos de visibilidad SQS, reentrega e identificadores de recepción.
- DevOps Engineer – Professional (DOP-C02) · Tarea 5.1: Práctica de fundamentos: Tiempos de visibilidad SQS, reentrega e identificadores de recepción.
- Solutions Architect – Professional (SAP-C02) · Tarea 2.4: Práctica de fundamentos: Tiempos de visibilidad SQS, reentrega e identificadores de recepción.
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.

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.

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.



