π 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! β