NATS Protocol Gateway
TinyMQ v2.9.0 introdujo un gateway nativo del protocolo de texto NATS sin dependencias externas.
Esto te permite usar clientes NATS estándar y altamente optimizados (nats.go, nats.py, nats.js, async-nats) para interactuar con TinyMQ. Como NATS utiliza conexiones TCP persistentes, elimina por completo la sobrecarga de HTTP, ofreciendo un throughput significativamente mayor para microservicios.
Habilitar el NATS Gateway
Por defecto, el NATS gateway está deshabilitado. Para habilitarlo, configura el puerto:
TINYMQ_NATS_PORT=4222
Enrutamiento entre protocolos
Al igual que MQTT, el NATS gateway está completamente integrado con el WAL central de TinyMQ.
Comandos soportados
TinyMQ implementa las especificaciones del protocolo de texto NATS:
| Comando | Estado | Notas |
|---|---|---|
INFO | ✅ Soportado | Enviado por el servidor al conectarse |
CONNECT | ✅ Soportado | Parsea las opciones del cliente y la autenticación |
PUB | ✅ Soportado | Publica el mensaje en el WAL |
SUB | ✅ Soportado | Registra un listener spy no destructivo |
UNSUB | ✅ Soportado | Elimina el listener |
PING / PONG | ✅ Soportado | Keep-alive |
MSG | ✅ Soportado | Entrega de mensajes salientes |
Autenticación
Si TINYMQ_API_KEY está configurado, los clientes NATS deben autenticarse. El gateway soporta dos métodos durante el handshake CONNECT:
auth_token: Establécelo directamente con la API key.userypass: El campopassdebe coincidir con la API key.
Traducción de subjects
NATS utiliza caracteres wildcard específicos para los subjects. El gateway los traduce automáticamente al formato interno de wildcards de TinyMQ:
| Subject NATS | Traducción en TinyMQ | Descripción |
|---|---|---|
foo.> | foo.* | Coincide con foo.bar, foo.baz.qux |
foo.* | foo.* | Coincide con foo.bar |
Límites del sistema
El NATS gateway aplica los límites centrales de TinyMQ:
- Payload máximo: 2 MB. Los payloads más grandes provocarán una respuesta
-ERR 'Payload Too Large'y la desconexión. - Timeout de inactividad: 60 segundos sin un PING resultarán en desconexión.
Ejemplo de código (Go)
package main
import (
"log"
"github.com/nats-io/nats.go"
)
func main() {
// Connect to TinyMQ's NATS Gateway
nc, err := nats.Connect("nats://localhost:4222", nats.Token("your_api_key"))
if err != nil {
log.Fatal(err)
}
defer nc.Close()
// Subscribe
nc.Subscribe("orders.>", func(m *nats.Msg) {
log.Printf("Received: %s on %s", string(m.Data), m.Subject)
})
// Publish
nc.Publish("orders.created", []byte(`{"id": 123}`))
select {} // Block forever
}