¿Por qué mi cola FIFO de Amazon SQS no devuelve todos los mensajes o los mensajes de otros grupos?
Mi cola FIFO (primero en entrar, primero en salir) de Amazon Simple Queue Service (Amazon SQS) no devuelve algunos mensajes cuando llamo a la API ReceiveMessage.
Solución
En el caso de las colas FIFO, no se puede solicitar recibir mensajes de un ID de grupo de mensajes concreto. Tampoco se puede filtrar la llamada a la API ReceiveMessage para que devuelva solo los mensajes de un grupo de mensajes cada vez.
Al especificar un parámetro MaxNumberOfMessages en la llamada a la API ReceiveMessage, SQS devuelve tantos mensajes con el mismo ID de grupo de mensajes como sea posible. La llamada a la API ReceiveMessage también puede devolver mensajes de otros grupos de mensajes disponibles.
En el caso de las colas FIFO, si se muestra un mensaje que pertenece a un ID de grupo de mensajes concreto, tenga en cuenta lo siguiente:
- Debe eliminar los mensajes del ID de grupo de mensajes actual para poder recibir más mensajes dentro del mismo ID de grupo de mensajes.
- Los mensajes recibidos que aún no se han eliminado se encuentran en curso. Los mensajes en curso bloquean la entrega de los mensajes disponibles dentro del mismo grupo de mensajes.
- Un motivo habitual por el que los mensajes pueden encontrarse en curso es un fallo inesperado del cliente consumidor. Otro motivo puede ser que la función del consumidor descendente de AWS Lambda se haya topado con excepciones o haya alcanzado su simultaneidad máxima.
- La API ChangeMessageVisibility puede extender o acortar el periodo de espera de la visibilidad de los mensajes en curso.
- Puede esperar a que transcurra el periodo de espera de la visibilidad de los mensajes antes de permitir una nueva entrega de mensajes.
Tenga en cuenta la siguiente información en relación con todas las colas FIFO y los límites de cuota de Amazon SQS:
- Las colas FIFO pueden tener 20 000 mensajes en curso como máximo.
Nota: Amazon SQS no devuelve mensajes de error que superen los límites de cuota. - Las colas FIFO pueden procesar hasta 300 transacciones por segundo (TPS) sin activar el modo de rendimiento elevado. En el caso de solicitudes de más de 300 TPS, se muestra el error «ThrottlingException» aunque haya mensajes disponibles en la cola.
- Los mensajes de cola FIFO de SQS se almacenan en particiones. Cada partición admite hasta 300 TPS para las operaciones de envío, recepción y eliminación. Para obtener más información, consulte Optimizing partition utilization.
- Es posible que las colas FIFO con un rendimiento elevado compartan una partición con varios grupos de mensajes. Si un grupo de mensajes supera el límite de 300 TPS de su partición, los mensajes de otros grupos de esa partición no se entregarán por dicha limitación.
- Las transacciones por segundo con un rendimiento elevado de la cola FIFO varían según la región de AWS. Para obtener más información, consulte Quotas related to messages.
Para reducir el límite de rendimiento de Amazon SQS en las colas FIFO, siga estas pautas:
- Utilice las acciones por lotes de API SendMessageBatch, DeleteMessageBatch y ChangeMessageVisibilityBatch de Amazon SQS para reducir el coste o cambiar hasta diez mensajes. En el caso de la API ReceiveMessage, defina el parámetro MaxNumberofMessages de modo que se muestren hasta diez mensajes por transacción. Para obtener más información, consulte Amazon SQS batch actions.
- En el caso de las colas FIFO con un rendimiento elevado, siga las recomendaciones para optimizar la utilización de las particiones. Envíe en lotes los mensajes con el mismo ID de grupo de mensajes. Elimine mensajes o cambie los valores de tiempo de espera de visibilidad en lotes cuando los identificadores de recepción correspondan a las mismas solicitudes de la API ReceiveMessage.
- Active el modo de rendimiento elevado para las colas FIFO.
- En el caso de las colas FIFO con un rendimiento elevado, utilice un parámetro MessageGroupId con varios valores únicos. Esto permite una distribución uniforme entre las particiones de colas FIFO. Para obtener más información, consulte Using the Amazon SQS message group ID.
Una cola FIFO examina los primeros 20 000 mensajes para determinar el grupo de mensajes disponible. Si los grupos de mensajes de los primeros 20 000 mensajes están bloqueados debido a los mensajes en curso, no se devolverán los mensajes de otros grupos que superen los primeros 20 000 mensajes. Para obtener más información, consulte Avoid having a large backlog of messages with the same group ID.
Ejemplo A
Una cola FIFO tiene un total de 20 001 mensajes. Los primeros 20 000 mensajes pertenecen al grupo de mensajes 1, mientras que el último mensaje pertenece al grupo de mensajes 2. Cuando intenta recibir mensajes de la cola, solo se muestra un mensaje del grupo 1. Si posteriormente se vuelve a llamar a la API ReceiveMessage, se mostrará un resultado en blanco. Esto sucede porque FIFO solo revisa los mensajes que pertenecen al grupo 1 y ese grupo está bloqueado por la llamada actual.
Ejemplo B
Una cola FIFO tiene un total de 20 000 mensajes. Los primeros 19 999 mensajes pertenecen al grupo de mensajes 1, mientras que el último mensaje pertenece al grupo de mensajes 2. Cuando intenta recibir mensajes de la cola, la primera llamada a la API ReceiveMessage obtiene un mensaje que pertenece al grupo 1. La segunda llamada a la API ReceiveMessage obtiene un mensaje que pertenece al grupo 2. Si se realizan más llamadas a la API ReceiveMessage, se mostrará un resultado en blanco, ya que ambos grupos están bloqueados por las llamadas actuales.
Información relacionada
Contenido relevante
- OFICIAL DE AWSActualizada hace 3 años
- OFICIAL DE AWSActualizada hace 3 años
- OFICIAL DE AWSActualizada hace 2 años
- OFICIAL DE AWSActualizada hace 8 meses