No se suscriba a #, entonces, ¿cómo volcar todos los mensajes a la base de datos con Mosquitto?

16

El blog de HiveMQ se enumera en "mejores prácticas" para no suscribirse al comodín multinivel al intentar volcar todos los mensajes en una base de datos. Afirman que el cliente suscriptor puede no ser capaz de mantenerse al día con una gran carga de mensajes y propone utilizar un complemento de intermediario para conectarse directamente a la secuencia de mensajes.

A veces es necesario suscribirse a todos los mensajes, que se transfieren a través del intermediario, por ejemplo, cuando se persisten en una base de datos. Esto no debe hacerse utilizando un cliente MQTT y suscribiéndose al comodín multinivel. La razón es que, a menudo, el cliente suscriptor no puede procesar la carga de mensajes que se le presentan. Especialmente si tienes un rendimiento masivo. Nuestra solución recomendada es implementar una extensión en el agente MQTT, por ejemplo, el sistema de complementos de HiveMQ le permite engancharse al comportamiento de HiveMQ y agregar una rutina asíncrona para procesar cada mensaje entrante y conservarlo en una base de datos.

¿Hay alguna

  • un sistema similar (extensión / complemento) para el agente de mosquitto,
  • otro método recomendado que funciona con mosquitto, o
  • ¿evidencia razonable de que este enfoque es innecesario en absoluto, es decir, que un cliente que se suscribe #puede hacerlo bien?

/programming//q/31584613/3984613 no aborda esta pregunta exhaustivamente.

Ghanima
fuente

Respuestas:

12

un sistema similar (extensión / complemento) para el agente de mosquitto

Hasta donde sé, no hay un complemento / extensión para mosquitto broker (al menos no hay código abierto)

Otro método recomendado que funciona con mosquitto

Bueno, puedo decir que según mi experiencia con el agente Mosquitto y AWS IoT, puede suscribirse directamente a '#'

Evidencia razonable

Después de analizar esta pregunta, tenía un poco de curiosidad por conocer los límites de rendimiento y saber si era necesario un sistema de extensión. Así que configuré lo siguiente:

  • 100 funciones de AWS Lambda que actúan como dispositivos finales virtuales para enviar algunos datos aleatorios a la puerta de enlace (instancia EC2 de t2.nano500 MB de RAM)
  • Cada 60 segundos, se activan funciones para publicar datos en la puerta de enlace a diferentes temas (lambdatoec2 / {VariableTopicNumberFrom1-100}
  • La instancia EC2 ejecuta Mosquitto 1.4.10

A partir de ahora, veo que no hay ningún problema para suscribirse a # sin ningún sistema de extensión. Pero, de nuevo, todavía tengo que probar algunos escenarios de casos extremos (actualizaré la respuesta una vez que los pruebe).

bravokeyl
fuente
La respuesta "correcta" es la prueba. Si se puede demostrar que el rendimiento de su sistema se ve afectado negativamente al agregar un suscriptor a #, vuelva a configurar el intermediario para no permitir # suscripciones. Voté esta respuesta porque @bravokeyl hizo exactamente eso.
John Deters
11

Esta discusión en la lista de correo de openHAB parece sugerir que no hay problema con el uso #como suscripción para recibir todos los mensajes:

Al solucionar problemas de dispositivos MQTT, se me ocurrió que a veces desearía poder ver todos los mensajes MQTT que ve el agente Mosquitto, en lugar de un mensaje sobre un tema específico. ¿Hay alguna forma de hacer esto?

Alguien respondió esta pregunta por usted en la lista de Mosquitto; usa un comodín. (#)

Esta pregunta de desbordamiento de pila también sugiere el mismo método:

Suscribirse a # le otorga una suscripción a todo excepto los temas que comienzan con un $ (de todos modos, normalmente son temas de control).

Sin embargo, es mejor saber a qué se está suscribiendo primero, y tenga en cuenta que algunas configuraciones de intermediario pueden rechazar la suscripción a # explícitamente.

Como señaló Bence Kaulics , la especificación establece que #es válida:

Comentario no normativo

  • "#" Es válido y recibirá cada mensaje de solicitud

Honestamente, disputo si la afirmación original realmente tiene mucho sentido:

La razón es que, a menudo, el cliente suscriptor no puede procesar la carga de mensajes que se le presentan.

Si ese es el caso, ¿cómo podría el corredor manejar los mensajes en primer lugar? Mientras que su cliente tiene características de rendimiento similares a las del corredor, yo fuertemente dudo que sería posible abrumar al cliente, ya que el nivel de tráfico también abrumaría el corredor y la causa de que se bloquee en primer lugar.

En resumen, la afirmación de HiveMQ no parece estar respaldada por mucha evidencia de otras fuentes y, cuando considera lo que realmente significaría, no parece particularmente lógico.

Aurora0001
fuente
10

Creo que es importante tener en cuenta que hay muchos casos de uso diferentes para los corredores MQTT, como con cualquier pieza de software.

El manejo de mensajes de chat para mil millones de usuarios (muchos usuarios, tasa de mensajes relativamente baja por usuario) es diferente a un sistema con pocos clientes pero una tasa de mensajes alta, y ambos son diferentes a un sistema de automatización del hogar (pocos clientes, tasa de mensajes baja) .

HiveMQ está pensando en las aplicaciones de alta tasa de clientes / mensajes, en cuyo caso la capacidad del intermediario casi seguramente supera con creces la de un cliente.

Si desea suscribirse #en su sistema de automatización del hogar, es muy poco probable que cause problemas. Puede verificar y ver si el corredor está utilizando una CPU excesiva en cualquier caso.

Como en las otras respuestas, suscribirse #le dará todos los temas "normales", eso es todo lo que no comienza con un $. Interpreto la especificación como decir que cada tema que comienza con $un árbol separado entera en sí misma, por lo que tendría que suscribir $SYS/#, $whatever/#para conseguir todo . Lo más probable es que no quiera hacer eso de todos modos para una aplicación normal.

ralight
fuente