¿Es MQTT mejor que HTTP para la comunicación cliente-servidor de la aplicación móvil (iOS, Android, etc.)?

Yo diría que todo depende del caso de uso. Utilizamos MQTT principalmente por sus beneficios inherentes. En comparación con HTTPS sobre 3G, MQTT

  • tiene un rendimiento 93 veces más rápido
  • utiliza 11.89x menos batería para enviar
  • utiliza 170.9x menos batería para recibir
  • toma la mitad de energía para mantener la conexión abierta
  • tiene 8 veces menos sobrecarga de red

(Las estadísticas se toman de Power Profiling: HTTPS Long Polling vs. MQTT con SSL, en Android).

Todos los puntos anteriores son extremadamente útiles para nosotros. Principalmente utilizamos MQTT como mecanismo de inserción, pero hemos eliminado el uso de HTTP en varios lugares debido a sus beneficios inherentes (ya que MQTT admite la comunicación bidireccional). No hace falta decir que, para nuestro caso de uso, MQTT realmente ha sido una bendición.

Una de las ventajas de HTTP, y los límites de MQTT, es el comportamiento en los entornos de wifi gratuito como el que se encuentra en cafeterías y bibliotecas. Estoy ejecutando Owntracks en mi teléfono Android (que es un cliente MQTT increíble para la ubicación) pero, y aquí está el gran pero, realmente no siempre funciona en todas las redes wifi de acceso público aleatorio a las que me conecto. Algunas conexiones wifi gratuitas solo entregan tráfico web, y eso puede ser un problema.

Si sabe que siempre usará una conexión móvil celular, entonces debería ser bueno con MQTT, pero hay algunos casos de uso de borde de wifi público donde HTTP será más robusto.

Depende de su patrón de comunicación cliente-servidor.
Primero responderías dos preguntas:
1. ¿Necesita un mensaje de baja latencia? (es decir, casi en tiempo real vs. está bien con hipo / retrasos aquí o allá)
2. ¿Necesita una capacidad de transmisión (es decir, fanout de 1 a muchos o Pub / Sub donde tiene muchos suscriptores por tema)

Si la respuesta a una o ambas preguntas es verdadera, entonces es mejor que use MQTT o protocolos similares basados ​​en sockets de larga duración (WebSockets, Socket.IO, etc.)

En nuestra implementación de MQTT, recurrimos a WebSockets y luego a SockJS, por lo que admitimos todo tipo de navegadores antiguos como IE6 o Kindle y proxies HTTP / firewalls corporativos / redes móviles esotéricas.

Puede hacer mqtt sobre http, por lo que no son mutuamente excluyentes.

Hay, por ejemplo, implementaciones de mqtt sobre websocket, que permiten que el protocolo pase a través de servidores proxy http.

Uno no es mejor que el otro porque son cosas diferentes. En aplicaciones móviles, MQTT generalmente se ejecuta sobre HTTP (WebSockets encriptados con TLS para ser más específicos) para que los firewalls y las políticas de seguridad del navegador no bloqueen sus conexiones. A veces, una API de nivel superior como la proporcionada por las diversas bibliotecas de clientes mqtt es muy útil. A veces es mejor codificar directamente a un protocolo de nivel inferior o una API como HTTP o XMLHttpRequest. Todo eso depende del caso de uso. Si desea publicar / suscribirse de uno a muchos, entonces MQTT es muy útil. Si desea datos de transmisión bidireccionales desde la aplicación móvil al servidor (o los sistemas de fondo detrás de él), entonces MQTT es muy útil. Si desea hacer una solicitud / respuesta básica de estilo AJAX para obtener datos de un servidor, MQTT simplemente se interpondrá y complicará algo que es mucho más fácil de hacer en una o dos líneas de JavaScript y XMLHttpRequest.

Depende del requisito

Cuando usted requiere

1. Comunicación en tiempo real entre dispositivos

2.Cuando necesite comunicación de varios dispositivos, como el modelo pub-sub, donde el dispositivo puede publicar datos y un tema y los dispositivos que se han suscrito a ese tema pueden obtener datos en tiempo real

3. La latencia de la mensajería debe ser mínima y eficiente en el ancho de banda

4. Protocolo eficiente de la batería

entonces puedes elegir MQTT.

He escrito un blog sobre la implementación de MQTT en Android y tengo un enlace a mi repositorio de Github (Código fuente de implementación de MQTT en andoid)

Enlace al blog:

Android MQTT