Saltar al contenido principal

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:

ComandoEstadoNotas
INFO✅ SoportadoEnviado por el servidor al conectarse
CONNECT✅ SoportadoParsea las opciones del cliente y la autenticación
PUB✅ SoportadoPublica el mensaje en el WAL
SUB✅ SoportadoRegistra un listener spy no destructivo
UNSUB✅ SoportadoElimina el listener
PING / PONG✅ SoportadoKeep-alive
MSG✅ SoportadoEntrega 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:

  1. auth_token: Establécelo directamente con la API key.
  2. user y pass: El campo pass debe 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 NATSTraducción en TinyMQDescripció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
}