🚀 Microservicio de alta performance en Rust con Socket.IO
Diseñado para manejar miles de conexiones concurrentes con broadcasting en tiempo real
- 🚀 Inicio Rápido
- ✨ Características
- 🛠️ Stack Tecnológico
- 📦 Instalación
- 🐳 Docker
- 🧪 Pruebas de Carga
- ⚙️ Configuración
- 🤝 Contribuciones
- 📄 Licencia
# Clona el repositorio
git clone https://github.com/paulpwo/sockets_server_rust.git
cd rust-socketio-microserv
# Compila y ejecuta
cargo run --release
# El servidor estará disponible en http://localhost:3000Microservicio WebSocket de alto rendimiento implementado en Rust usando Axum y Socket.IO. Diseñado para manejar miles de conexiones concurrentes con broadcasting en tiempo real, métricas de salud integradas y monitoreo completo del sistema.
- 🔥 Alto Rendimiento: Implementado en Rust para máxima eficiencia
- 🌐 Socket.IO Compatible: Soporte completo para clientes Socket.IO
- 📡 Broadcasting: Envío de mensajes a múltiples canales simultáneamente
- 📊 Métricas Integradas: Endpoints de salud y métricas en tiempo real
- 🐳 Docker Ready: Imagen optimizada multi-stage
- ⚡ Escalable: Diseñado para miles de conexiones concurrentes
- 🔒 Seguro: Licencia AGPL-3.0 y mejores prácticas de seguridad
- Rust - Lenguaje de sistemas de alto rendimiento
- Axum - Framework web moderno y rápido
- Socket.IO - Comunicación bidireccional en tiempo real
- Tokio - Runtime asíncrono
- Docker - Contenedorización
- Rust 1.70 o superior
- Cargo (incluido con Rust)
- Git
-
Clona el repositorio:
git clone https://github.com/paulpwo/sockets_server_rust.git
-
Navega al directorio del proyecto:
cd rust-socketio-microserv -
Compila el proyecto:
cargo build --release
-
Ejecuta el servidor:
cargo run --release
El servidor se iniciará en http://localhost:3000 por defecto.
Construye la imagen:
docker build -t rust-socketio-microserv .Ejecuta el contenedor:
docker run -p 3000:3000 rust-socketio-microservCon variables de entorno:
docker run -p 3000:3000 -e PORT=3000 rust-socketio-microserv| Endpoint | Método | Descripción |
|---|---|---|
/ |
GET | Información básica del servicio |
/health |
GET | Estado de salud del servidor |
/metrics |
GET | Métricas del sistema en JSON |
/ws |
WebSocket | Conexión WebSocket principal |
/SendWebsocketEvent |
POST | Enviar eventos a clientes conectados |
Conectar cliente Socket.IO:
const io = require('socket.io-client');
const socket = io('http://localhost:3000');
socket.on('connect', () => {
console.log('Conectado al servidor');
socket.emit('message', 'Hola servidor!');
});
socket.on('broadcast', (data) => {
console.log('Mensaje recibido:', data);
});Enviar evento via HTTP:
curl -X POST http://localhost:3000/SendWebsocketEvent \
-H "Content-Type: application/json" \
-d '{"event": "broadcast", "data": "Mensaje para todos"}'El proyecto incluye un cliente de prueba Socket.IO desarrollado en Node.js que permite realizar pruebas de carga exhaustivas para evaluar el rendimiento del servidor bajo diferentes condiciones de estrés.
1. Instala las dependencias:
cd loadtest
npm install2. Ejecuta las pruebas:
# Prueba básica (100 conexiones, 10 segundos)
npm test
# Prueba personalizada
npm test -- --connections 500 --duration 30 --interval 100| Parámetro | Descripción | Valor por Defecto |
|---|---|---|
--connections |
Número de conexiones simultáneas | 100 |
--duration |
Duración de la prueba (segundos) | 10 |
--interval |
Intervalo entre mensajes (ms) | 1000 |
--server |
URL del servidor | http://localhost:3000 |
Durante la ejecución verás métricas en tiempo real:
⏱️ 1:30 | 🔗 500 | 📤 750 | 📥 750 | ❌ 0 | 📊 8.3 msg/s
⏱️ 1:30: Tiempo transcurrido (minutos:segundos)🔗 500: Conexiones activas📤 750: Mensajes enviados📥 750: Mensajes recibidos❌ 0: Errores de conexión📊 8.3 msg/s: Throughput actual (mensajes por segundo)
# Prueba de estrés básica
npm test -- --connections 1000 --duration 60
# Prueba de latencia
npm test -- --connections 50 --interval 100 --duration 30
# Prueba de resistencia
npm test -- --connections 500 --duration 300 --interval 2000- Node.js 14+
- Servidor Rust ejecutándose en el puerto especificado
- Memoria suficiente para las conexiones simultáneas
- Descriptores de archivo adecuados (
ulimit -n)
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Load Balancer │ │ Rust Server │ │ Monitoring │
│ │ │ │ │ │
│ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │
│ │ Nginx │ │◄──►│ │ Axum │ │◄──►│ │ Metrics │ │
│ │ HAProxy │ │ │ │ Framework │ │ │ │ /health │ │
│ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │
└─────────────────┘ │ ┌───────────┐ │ └─────────────────┘
│ │ Socket.IO │ │
┌─────────────────┐ │ │ Engine │ │ ┌─────────────────┐
│ Clients │ │ └───────────┘ │ │ System Info │
│ │ │ ┌───────────┐ │ │ │
│ ┌───────────┐ │◄──►│ │ Tokio │ │◄──►│ ┌───────────┐ │
│ │ Browser │ │ │ │ Runtime │ │ │ │ CPU │ │
│ │ Node.js │ │ │ └───────────┘ │ │ │ Memory │ │
│ │ Mobile │ │ └─────────────────┘ │ │ Network │ │
│ └───────────┘ │ │ └───────────┘ │
└─────────────────┘ └─────────────────┘
- Conexión: Cliente se conecta via Socket.IO
- Autenticación: Validación opcional de credenciales
- Broadcasting: Mensajes distribuidos a canales específicos
- Métricas: Recolección continua de estadísticas
- Monitoreo: Endpoints de salud y métricas disponibles
- Conexiones Concurrentes: Hasta 10,000+ conexiones simultáneas
- Latencia: < 1ms para mensajes locales
- Throughput: 50,000+ mensajes/segundo
- Memoria: ~50MB base + ~1KB por conexión
- CPU: Optimizado para múltiples cores
- Imagen Docker: Multi-stage build para reducir el tamaño de la imagen final
- Usuario no-root: El contenedor ejecuta como usuario no-privilegiado para mayor seguridad
- Resource Limits: Configura límites basados en el uso observado:
resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi
- Health Checks: Usa el endpoint
/healthpara readiness y liveness probes - Scaling: Soporta escalado horizontal según la carga
- Configuración: Usa ConfigMaps para variables de entorno
apiVersion: apps/v1
kind: Deployment
metadata:
name: rust-socketio-microserv
spec:
replicas: 3
selector:
matchLabels:
app: rust-socketio-microserv
template:
metadata:
labels:
app: rust-socketio-microserv
spec:
containers:
- name: server
image: rust-socketio-microserv:latest
ports:
- containerPort: 3000
env:
- name: PORT
value: "3000"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi¡Las contribuciones son bienvenidas! Por favor:
- Fork el repositorio
- Crea una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -am 'Agrega nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Abre un Pull Request
Este proyecto está licenciado bajo la GNU Affero General Public License v3.0 - ver el archivo LICENSE para más detalles.
Paul Werner - @paulpwo
⭐ ¡Si te gusta este proyecto, dale una estrella! ⭐