La suscripción a PubSub REST no regresa con todos los mensajes

Usamos la API del servicio REST para extraer mensajes de una suscripción de PubSub. Los mensajes que están listos para ser atendidos se reconocen, dejando otros mensajes no reconocidos para ser atendidos durante un ciclo de ejecución posterior.

Durante un ciclo de ejecución, enviamos un solo requerimiento a la API REST del servicio de pull con returnImmediately=true y maxMessages=100 .

Durante la prueba, encontramos una situación en la que solo se devolverían 3 mensajes “antiguos” durante cada ciclo de ejecución. Los mensajes recién publicados nunca se incluyeron en la solicitud de pull . Verificamos que los nuevos mensajes llegaron con éxito a la suscripción al monitorear los mensajes no entregados en el monitoreo de Stackdriver.

  • ¿La API REST de pull no incluye todos los mensajes no entregados?
  • ¿ maxMessages parámetro maxMessages ?
  • ¿Cómo deben leerse todos los mensajes, hasta el máximo especificado, con la API REST?

Notas:

Resolvimos el problema enviando 2 solicitudes paralelas a la API de pull y combinando los resultados. Encontramos la solución (que requiere solicitudes paralelas) discutida aquí .

Actualización 22 de febrero de 2018

Escribí un artículo en nuestro blog que explica por qué nos obligamos a usar la API REST del servicio PubSub.

Una sola llamada de pull no necesariamente devolverá todos los mensajes no entregados, especialmente cuando el returnImmediately se establece de returnImmediately en verdadero. El maxMessages promete volver a la mayoría de maxMessages , no significa que siempre devolverá maxMessages si hay tantos mensajes disponibles.

La API de pull intenta equilibrar la devolución de más mensajes manteniendo baja la latencia de extremo a extremo. Preferiría devolver algunos mensajes rápidamente que esperar mucho tiempo para devolver más mensajes. Los mensajes deben recuperarse del almacenamiento o de otros servidores, por lo que a veces todos esos mensajes no están disponibles de inmediato para ser entregados. Una solicitud de pull posterior recibiría otros mensajes que se recuperaron más tarde.

Si desea aprovechar al máximo la posibilidad de recibir más mensajes con una solicitud de pull , establezca returnImmediately a falso. Esto todavía no garantiza que todos los mensajes se entregarán en una sola solicitud de pull , incluso si maxMessages es mayor que la cantidad de mensajes que aún no se han entregado. Aún debe enviar solicitudes de pull subsiguientes (o, lo que es más ideal, varias solicitudes de pull al mismo tiempo) para recuperar todos los mensajes.

Como alternativa, debería considerar cambiar a las bibliotecas de Google Cloud Pub / Sub Client , que manejan todo esto bajo el capó y envían mensajes a una callback que especifique tan pronto como estén disponibles.

    Intereting Posts