MQTT gestionado en la nube

Mensajes MQTT por segundo: cómo estimar y medir el rendimiento

Planificar el rendimiento de MQTT se reduce a unas pocas fórmulas y una medición honesta. Aprende a estimar los mensajes entrantes y salientes por segundo, a tener en cuenta los picos y a trasladar el resultado a un plan de broker.

Ilustración de mensajes MQTT por segundo con un indicador de rendimiento que muestra mensajes entrantes de dispositivos y fan-out saliente hacia los suscriptores
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

Estimar los mensajes MQTT por segundo es el ejercicio de dimensionamiento más útil que puedes hacer antes de elegir un plan de broker, y lleva menos de una hora. Esta guía muestra cómo calcular las tasas de mensajes entrantes y salientes de tu flota, tener en cuenta los picos y la sobrecarga del protocolo, medir el tráfico real con un script breve y traducir las cifras en una decisión de plan.

Entrante, saliente y por qué importan ambos

Un broker gestiona dos flujos de mensajes:

  • Entrante: mensajes que los clientes publican en el broker.
  • Saliente: copias que el broker entrega a los suscriptores que coinciden.

Si cada mensaje tiene exactamente un suscriptor, ambos son iguales. En los sistemas reales rara vez lo son. Un mensaje de telemetría leído por un dashboard, un historian y un servicio de alertas produce tres entregas salientes. Un comando enviado a un dispositivo produce una. Un suscriptor con comodín, como una herramienta de depuración suscrita a #, lo recibe todo. El saliente suele ser la cifra mayor, así que estima siempre ambos.

Las fórmulas básicas

Solo necesitas tres:

  1. Tasa entrante (msg/s) = número de publicadores x mensajes por publicador por segundo
  2. Tasa saliente (msg/s) = tasa entrante de cada topic x número de suscriptores que coinciden, sumado para todos los topics
  3. Ancho de banda (bytes/s) = (entrante + saliente) x tamaño medio de mensaje, más la sobrecarga del protocolo y de TLS

Aquí, el tamaño de mensaje es el payload MQTT más la cadena del topic y unos pocos bytes de cabecera fija. En telemetría pequeña, el topic puede ser tan grande como el payload, que es una de las razones por las que existen los topic aliases de MQTT 5.

Ten en cuenta el QoS cuando razones en paquetes en lugar de en mensajes. QoS 0 envía un paquete por entrega. QoS 1 añade un PUBACK por cada publicación en cada dirección. QoS 2 usa un intercambio de cuatro paquetes. El número de mensajes no cambia, pero sí el número de paquetes y el trabajo del broker.

Un ejemplo práctico

Imagina una planta hipotética en Monterrey con tres tipos de publicadores. Estas cifras son ilustrativas, no mediciones.

Grupo de publicadores Cantidad Intervalo de publicación Entrantes msg/s Suscriptores por mensaje Salientes msg/s
Sensores ambientales 120 cada 60 s 2,0 2 (dashboard, historian) 4,0
Pasarelas de máquinas 15 cada 1 s 15,0 3 (dashboard, historian, alertas) 45,0
Estado de dispositivos 135 al cambiar, aprox. cada 10 min 0,2 1 (monitor) 0,2
Total 270 17,2 49,2

Casi siempre se extraen tres observaciones de una tabla como esta:

  • Quince pasarelas rápidas generan la mayor parte del tráfico, mientras que 120 sensores lentos apenas se notan.
  • El saliente es casi tres veces el entrante por el fan-out.
  • El número de conexiones, 270 clientes más los suscriptores backend, puede ser el límite que alcances primero, mucho antes de que la tasa de mensajes sea un problema.

Planificar para los picos, no para las medias

Las medias ocultan los momentos que causan problemas. Añade márgenes explícitos para:

  • Avalanchas de reconexión. Tras una caída, los dispositivos se reconectan a la vez y muchos vacían de golpe las lecturas almacenadas.
  • Temporizadores sincronizados. Los dispositivos que arrancan a la vez y publican cada 60 segundos publicarán en el mismo segundo. Añade un jitter aleatorio a la primera publicación.
  • Ráfagas de eventos. Las alarmas suelen encadenarse: un fallo dispara decenas de alertas relacionadas.
  • Cambios de turno o de horario. Las líneas de producción que arrancan juntas crean saltos bruscos en el tráfico.
  • Sesiones de depuración. Alguien que se suscribe a # en una herramienta de escritorio añade una copia completa de todo el tráfico.

Una regla práctica sencilla es dimensionar para un pico varias veces superior a la media y verificar que los clientes suavizan sus ráfagas con limitación de tasa y jitter.

Cómo medir las tasas de mensajes reales

Las estimaciones son un punto de partida; la medición te mantiene honesto. El script siguiente se suscribe a un filtro de topic e imprime cada cinco segundos los mensajes por segundo y los bytes por segundo. Apúntalo a tu propio broker con credenciales de producción, o pruébalo en el servidor MQTT público gratuito, pensado para pruebas y no para datos de producción, con un prefijo de topic único.

# rate_meter.py - mide los mensajes MQTT por segundo en un filtro de topic
import sys
import threading
import time

import paho.mqtt.client as mqtt

HOST = "broker.connectmq.com"
FILTER = sys.argv[1] if len(sys.argv) > 1 else "connectmq/demo/r8m2/#"
WINDOW = 5

lock = threading.Lock()
count = 0
nbytes = 0
per_topic = {}

def on_connect(client, userdata, flags, reason_code, properties):
    print("connected:", reason_code, "- measuring", FILTER)
    client.subscribe(FILTER, qos=0)

def on_message(client, userdata, msg):
    global count, nbytes
    with lock:
        count += 1
        nbytes += len(msg.payload) + len(msg.topic)
        per_topic[msg.topic] = per_topic.get(msg.topic, 0) + 1

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
                     client_id="rate-meter-r8m2", protocol=mqtt.MQTTv5)
# Para tu broker privado, descomenta estas líneas y usa el puerto 8883:
# client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
# client.tls_set()
client.on_connect = on_connect
client.on_message = on_message
client.connect(HOST, 1883)
client.loop_start()

while True:
    time.sleep(WINDOW)
    with lock:
        msgs, size, top = count, nbytes, sorted(per_topic.items(), key=lambda kv: -kv[1])[:3]
        count = nbytes = 0
        per_topic.clear()
    print(f"{msgs / WINDOW:8.1f} msg/s  {size / WINDOW / 1024:8.2f} KB/s  top: {top}")

Para generar tráfico de prueba en otro terminal:

for i in $(seq 1 200); do
  mosquitto_pub -h broker.connectmq.com -p 1883 -i rate-pub-r8m2 \
    -t "connectmq/demo/r8m2/sensor/$((i % 5))" -m "{\"v\":$i}"
  sleep 0.2
done

El ritmo importa: el servidor público permite 10 mensajes por segundo por cliente, así que mantén los publicadores de prueba por debajo de esa cifra. Cuando midas un broker de producción, ejecuta el medidor como un cliente separado con sus propias credenciales y mide durante un periodo de actividad, no de madrugada.

Cómo trasladar el rendimiento a un plan de broker

Una vez que tengas cifras, compáralas con los límites de los planes. En ConnectMQ, los límites que debes comprobar son:

Plan Conexiones QoS máximo Tamaño máximo de mensaje Suscripciones compartidas
Serverless (Free) Hasta 25 1 256 KB No
Serverless (Paid) Hasta 1.000 2 1 MB Sí
Dedicated Clúster aislado dimensionado contigo A tratar con el equipo A tratar con el equipo A tratar con el equipo
BYOC En tu cuenta cloud, dimensionado contigo A tratar con el equipo A tratar con el equipo A tratar con el equipo

Cómo leer la tabla frente a tu estimación:

  1. Primero, las conexiones. Suma publicadores, suscriptores, dashboards y herramientas. Esa cifra suele decidir entre Serverless gratuito y de pago.
  2. Segundo, el mensaje más grande. Si algún mensaje, incluido un lote de backlog, supera los 256 KB, necesitas el plan de pago o lotes más pequeños.
  3. Tercero, el QoS. Si algún flujo requiere entrega exactamente una vez, necesitas QoS 2.
  4. Cuarto, el escalado de consumidores. Si un único suscriptor backend no puede seguir el ritmo de tu tasa saliente, necesitas suscripciones compartidas para repartir la carga entre instancias.
  5. Por último, el aislamiento. Si tu rendimiento es alto y sostenido, o no puedes aceptar que la actividad de otros inquilinos afecte a la tuya, valora Dedicated o BYOC y comparte con el equipo tus cifras de entrante, saliente y picos.

Para saber cómo se comportan las cuotas al alcanzar los límites, lee cuotas de conexión de un broker MQTT. Para una visión más amplia del crecimiento de un despliegue, consulta cómo escalar un broker MQTT y cuántas conexiones soporta un broker MQTT.

Formas de reducir la tasa de mensajes

Si tu estimación es más alta de lo que te gustaría, estas técnicas reducen el tráfico sin perder información:

  • Informar por excepción. Publica cuando un valor cambie más allá de una banda muerta en lugar de con un temporizador fijo.
  • Agrupar muestras. Envía un mensaje con diez lecturas en lugar de diez mensajes.
  • Submuestrear en el edge. Publica medias de un segundo en lugar de muestras en bruto de alta frecuencia cuando los consumidores no necesiten los datos en bruto.
  • Acotar las suscripciones. Elimina los suscriptores a # innecesarios, que multiplican el tráfico saliente.
  • Usar payloads compactos. Claves JSON más cortas o codificaciones binarias como Protobuf reducen los bytes por mensaje.
  • Usar topic aliases. En MQTT 5, los aliases reducen las cadenas de topic largas y repetidas a un entero pequeño.

Empieza con ConnectMQ

ConnectMQ es un broker MQTT gestionado con límites claros por plan, un explorador de topics en vivo y un dashboard para observar el tráfico mientras fluye. Crea un broker Serverless gratuito en app.connectmq.com, sin tarjeta de crédito, ejecuta el medidor de tasa contra él y elige el plan que indiquen tus cifras. Para ver todas las opciones de alojamiento, consulta la guía del broker MQTT en la nube.

Preguntas frecuentes

¿Cómo calculo los mensajes MQTT por segundo?

Multiplica el número de publicadores por la frecuencia con la que publica cada uno para obtener la tasa entrante, y luego multiplica la tasa entrante de cada topic por su número de suscriptores para obtener la tasa saliente. Añade un margen para los picos.

¿Por qué el tráfico saliente es mayor que el entrante?

Cada mensaje publicado se entrega a todos los suscriptores que coinciden, así que un mensaje leído por tres servicios cuenta tres veces en el saliente. Los suscriptores con comodines lo aumentan todavía más.

¿Afecta el QoS a los mensajes por segundo?

El QoS no cambia cuántos mensajes envías, pero QoS 1 y 2 añaden paquetes de confirmación y trabajo del broker por cada mensaje. Usa QoS 0 para telemetría de alta frecuencia en la que la siguiente muestra sustituye a la anterior.

¿Qué tasa de mensajes permite el servidor MQTT público gratuito de ConnectMQ?

El servidor MQTT público gratuito permite 10 mensajes por segundo por cliente, con 64 KB por mensaje, y está pensado para pruebas, no para datos de producción. Los planes privados se definen por número de conexiones, tamaño de mensaje y límites de QoS, así que compáralos con tu estimación.

Artículos relacionados

Broker MQTT BYOC: el modelo Bring Your Own Cloud explicado

Un broker MQTT BYOC se ejecuta en tu cuenta cloud, pero lo opera un proveedor. Descubre cómo funciona el modelo, cómo se reparten las responsabilidades y cómo preparar tu cuenta.

9 min de lectura

Alternativa a Google Cloud IoT Core: opciones y migración tras su cierre

Google retiró Cloud IoT Core en agosto de 2023. Esta guía compara las alternativas realistas, traduce los conceptos de IoT Core a MQTT estándar y muestra cómo mover los dispositivos a un broker MQTT gestionado sin dejar de enviar datos a Google Cloud.

9 min de lectura

Latencia de un broker MQTT por región: cómo medirla y elegir ubicación

El lugar donde se ejecuta tu broker determina buena parte de la latencia MQTT de extremo a extremo. Descubre qué contribuye al retardo, cómo medir los tiempos de ida y vuelta desde tus propias sedes y cómo elegir la ubicación del despliegue.

8 min de lectura

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.