Tool
Gatling MQTT Demo
Gatling 3.14.9Scala 2.13Maven 3.8+Java 11+MQTTTLSHiveMQJMESPathIoT Testing
rcampos09/gatling-mqtt-demo-scala-rc
¿Por qué hacer load testing sobre MQTT?
🔗
Conexiones persistentes
📨
Pub/Sub asíncrono
🔒
TLS incluido
Stack técnico
| Componente | Versión | Rol en el proyecto |
|---|---|---|
| Scala | 2.13.17 | Lenguaje principal de la simulación — DSL nativo de Gatling |
| Gatling | 3.14.9 | Motor de load testing — genera reportes HTML con métricas de percentiles |
| Gatling MQTT | 3.14.9 | Extensión oficial de Gatling para el protocolo MQTT — connect, subscribe, publish, check |
| Maven | 3.8+ (wrapper incluido) | Build tool — incluye mvnw para Unix y mvnw.cmd para Windows |
| Java JDK | 11+ | Runtime de la JVM requerido por Scala y Gatling |
| HiveMQ | Public Broker | Broker MQTT gratuito en broker.hivemq.com:8883 — sin registro, TLS habilitado |
Estructura del proyecto
Instalación y setup
La simulación explicada
package io.gatling.mqtt.demo
import java.util.UUID
import scala.concurrent.duration._
import io.gatling.core.Predef._
import io.gatling.mqtt.Predef._
class MqttDemoSimulation extends Simulation {
// 1. Protocolo: broker HiveMQ público con TLS
val baseMqttProtocol = mqtt
.broker("broker.hivemq.com", 8883)
.useTls(true)
.correlateBy(jmesPath("id")) // correlación por campo "id"
// 2. Tópico único por ejecución (evita colisiones entre tests)
val topic = s"gatling-mqtt-demo/${UUID.randomUUID()}"
// 3. Escenario: cada VU hace connect → subscribe → publish → check
val scn = scenario("Publisher")
.exec(session => session.set("id", UUID.randomUUID()))
.exec(mqtt("Connecting").connect)
.exec(mqtt("Subscribing").subscribe(topic))
.exec(
mqtt("Publishing")
.publish(topic)
.message(StringBody("""{"id":"#{id}","message":"Hello from #{id}"}"""))
.await(1.second)
.check(jmesPath("message").is("Hello from #{id}"))
)
// 4. Inyección: 5 usuarios simultáneos
setUp(
scn.inject(atOnceUsers(5))
).protocols(baseMqttProtocol)
} Las 4 fases del flujo por usuario virtual
01
Connect
02
Subscribe
03
Publish
04
Check (await)
¿Qué es JMESPath y por qué importa aquí?
Ejecutar el test
⚠️ Entender el conteo de requests
5 VUs
50 VUs
100 VUs
Personalizar la carga
Smoke test — verificación básica 5 VUs simultáneos
setUp(scn.inject(atOnceUsers(5))).protocols(baseMqttProtocol) Load test — rampa gradual 100 VUs en 60 segundos
setUp(scn.inject(rampUsers(100).during(60.seconds))).protocols(baseMqttProtocol) Stress test — carga sostenida constante 10 VUs/segundo durante 5 minutos
setUp(scn.inject(constantUsersPerSec(10).during(5.minutes))).protocols(baseMqttProtocol) Reportes HTML
⏱️
Response time metrics
📈
Requests per second
👥
Active users timeline
📊
Response distribution
Adaptar a tu propio broker
MqttDemoSimulation.scala — modificar broker
val baseMqttProtocol = mqtt
.broker("tu-broker.example.com", 1883) // puerto 1883 sin TLS
.useTls(false) // o true + puerto 8883
.credentials("user", "password") // si requiere auth
.correlateBy(jmesPath("id"))