es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ZeroMQ PUSH / PULL – ¿cómo saber qué eventos están pendientes en la cola SEND BUFFER?

Tenemos un par de servicios que utilizan el patrón PUSH/PULL para comunicación de mensajes. Tal como se menciona en los documentos, si el servicio PULL está caído o no se está ejecutando, entonces el remitente acumulará hasta un número determinado de eventos hasta alcanzar un umbral máximo predefinido y, por defecto, después de eso, una llamada a .send() se bloqueará.

En este estado bloqueado, la aplicación podría cerrarse o suceder algo que haga que se pierdan los mensajes en la cola.

Comprendo que PUSH/PULL no es el mejor método si deseamos tener esa clase de confiabilidad, y probablemente deberíamos utilizar alguno de los otros métodos listados en: https://zguide.zeromq.org/docs/chapter4/, pero ¿existe alguna manera de obtener una llamada de retorno de los eventos que todavía están en cola en caso de salida de la aplicación/llamadas de retorno periódicas/señales utilizando el método PUSH/PULL?

También entiendo que podría utilizar NOBLOCK, ZMQ_IMMEDIATE o ZMQ_SNDTIMEO en dicha situación y capturar el error y utilizar la recuperación a nivel de aplicación (similar al patrón DLQ), pero estaba buscando opciones disponibles en la biblioteca ZeroMQ.

Tags:  

Answer

  1. Avatar for davy.ai

    Según la documentación de ZeroMQ, si un servicio PULL no está en funcionamiento, entonces el servicio PUSH se encolará hasta un alto número de eventos de marca de agua. Después de alcanzar esta marca, cualquier operación .send() bloqueará. Esto puede provocar la pérdida de mensajes en cola si la aplicación se detiene o sucede algo más mientras está en estado de bloqueo. Este comportamiento no proporciona la fiabilidad deseada.

    Para abordar esto, otros patrones enumerados en la documentación, como REQ/REP, DEALER/ROUTER y PUB/SUB, pueden ser más adecuados.

    Sin embargo, si es necesario utilizar el patrón PUSH/PULL, se pueden utilizar otras opciones como NOBLOCK, ZMQ_IMMEDIATE o ZMQ_SNDTIMEO para detectar errores e iniciar la recuperación a nivel de aplicación, similar a un patrón de cola de mensajes no entregados (DLQ).

    Desafortunadamente, no hay ningún mecanismo de devolución de llamada en el método PUSH/PULL para recuperar eventos de la cola de mensajes. Esta no es una característica disponible en la biblioteca ZeroMQ. Por lo tanto, se recomienda utilizar otros patrones o emplear otros métodos, como la recuperación a nivel de aplicación, para asegurar la fiabilidad deseada de la mensajería.

Comments are closed.