¿Cómo persiste EMQ los mensajes QoS 1/2?

10

El EMQ (Erlang MQTT Broker) es un "intermediario de mensajes MQTT altamente extensible distribuido, masivamente escalable" con un informe de "1.3 millones de conexiones MQTT concurrentes", por lo que potencialmente permite a un gran número de clientes publicarlo y suscribirse a él. Parece probable que algunos clientes puedan estar desconectados en cualquier momento.

Como esta pregunta ¿Qué sucede si Mosquitto se queda sin memoria para almacenar mensajes QoS 1/2? pregunta sobre Mosquitto:

En MQTT, los mensajes con QoS 1 o 2 deben entregarse al menos una vez (los mensajes de QoS 2 deben entregarse exactamente una vez). Si el cliente no está conectado, el intermediario debe almacenar el mensaje hasta que el cliente esté listo para recibirlo.

Entonces, ¿cómo EMQ persiste los mensajes QoS 1/2 hasta la entrega, es decir, un reinicio del intermediario o con respecto a los límites de memoria?

Ghanima
fuente
Relacionado: iot.stackexchange.com/q/809/54
Ghanima

Respuestas:

6

Entonces, ¿cómo EMQ persiste los mensajes de QoS 1/2 hasta la entrega, es decir, un reinicio del intermediario o con respecto a los límites de memoria?

La respuesta parece ser: no lo hace . Este problema en su rastreador de errores dice:

Estoy enfrentando el problema de almacenar sesiones de cliente persistentes después del reinicio del intermediario. ¿Esta característica actualmente no está presente en el corredor o me falta alguna configuración?

El corredor no persistirá las sesiones.

Además, después de analizar un par de problemas más, encontré este informe :

Inicialmente, configuré los clientes máximos en 1000K en emqttd.config. Nuestra máquina tiene 8 GB de memoria con 4 núcleos, puedo conectar una conexión simultánea de 120 K fácilmente, pero cuando excede los 8 GB de memoria, emqttd se termina por sí solo. Lo que pensé es establecer un cliente máximo por máquina sería mucho mejor.

Esencialmente, a partir de v2.0.5:

  • Los mensajes no parecen ser persistentes en un archivo.
  • Una vez que el corredor se queda sin memoria, simplemente se bloqueará.

No es exactamente ideal, pero ese parece ser el comportamiento actual, por lo que si los mensajes persistentes son críticos para su caso de uso, use un agente diferente.

Aurora0001
fuente
1
Parece ser extraño (por decir lo menos) para un corredor mqtt masivamente escalable.
Ghanima
Si está buscando un agente MQTT distribuido que persista los mensajes QoS1 / 2 en el disco (usando LevelDB), entonces quizás eche un vistazo a VerneMQ ( vernemq.com ).
Lars Hesel Christensen
Mmmh, aunque emqtt no almacena el mensaje por sí solo, se puede conectar a una serie de bases de datos, así que supongo que eso es lo que hace. ¿Lo has comprobado?
Fabien Papleux