DEV Community

Cover image for Diseño de sistemas: los cimientos invisibles que mantienen vivos tus servicios
Orli Dun
Orli Dun

Posted on • Originally published at my-million-friend-blog.vercel.app

Diseño de sistemas: los cimientos invisibles que mantienen vivos tus servicios

¡Hola Chiquis!👋🏻 La mayoría de los sistemas no fallan por falta de código. Fallan por falta de pensamiento. Por correr antes de entender. Por construir sin cimientos. En diseño de sistemas no hay atajos elegantes: hay decisiones silenciosas que se notan solo cuando todo tiembla. Idempotencia, caché, health checks, balanceo de carga… palabras que suenan técnicas, sí, pero que en el fondo hablan de algo muy humano: prever el error antes de que ocurra.

Este post es una invitación a volver a lo esencial. A entender por qué estas piezas existen, cómo se usan en la vida real y qué compromisos implican. Sin humo. Sin dogmas. Con ejemplos claros y cicatrices incluidas. Si alguna vez tu sistema se cayó "sin razón aparente", este texto es para ti. Si nunca se te ha caído ninguno… léelo antes de que te pase.

El diseño de sistemas no va de dibujar cajas y flechas para una presentación. Va de pensar antes de correr. De honrar lo que ya funciona. De preparar el terreno para lo que todavía no existe, pero llegará. Porque los sistemas, como las ciudades, crecen. Y si no hay orden desde el inicio, el caos se cobra su precio.

Los pilares del diseño de sistemas no son reglas talladas en piedra. Son acuerdos silenciosos entre el presente y el futuro. Escalabilidad, confiabilidad, simplicidad. Nada nuevo. Nada obsoleto. Todo esencial. Todo sistema, al final, cuenta una historia: la de las decisiones que se tomaron… y las que se evitaron.

¿Qué es realmente el diseño de sistemas?

Imagina el plano de una gran infraestructura digital. No una casa, sino una ciudad viva. El diseño de sistemas es el proceso de definir la arquitectura, los módulos, las interfaces y los datos de un sistema para que cumpla necesidades reales, hoy y mañana. No es escribir código a lo loco; es pensar cómo se va a construir, cómo se va a desplegar, cómo se va a mantener y cómo va a sobrevivir cuando el tráfico se multiplique por diez.

Un buen diseño no presume. Funciona. Crece. Resiste. Y, cuando falla, porque todo falla, se recupera con dignidad.

Los objetivos que guían toda buena arquitectura

Todo ingeniero que diseña sistemas persigue, consciente o no, cuatro grandes metas:

  • Escalabilidad: que el sistema soporte más usuarios sin romperse.
  • Desempeño: que responda rápido y sin desperdiciar recursos.
  • Seguridad: que los datos estén protegidos, incluso cuando algo sale mal.
  • Usabilidad: que sea útil para las personas, no solo correcto en teoría.

Si uno de estos pilares se ignora, el sistema lo recordará tarde o temprano.

Las piezas del juego

Un sistema se arma como un set de Lego bien pensado:

  • Bases de datos, donde vive la memoria.
  • Balanceadores de carga, que reparten el esfuerzo para que nadie se queme.
  • Cachés, pequeños atajos que ahorran tiempo y paciencia.
  • Servidores web y de aplicaciones, el hogar del código.
  • Colas y mensajería, para que las partes se comuniquen sin empujarse.

Ninguna pieza es mágica por sí sola. El valor está en cómo se conectan.

Conceptos clave para empezar con buen pie

Diseñar sistemas es aprender las reglas del tráfico digital:

  • Balanceo de carga: distribuir peticiones para evitar embotellamientos.
  • Patrones de arquitectura: experiencia destilada en guías prácticas.
  • API Gateway, Load Balancer y Reverse Proxy: cada uno con su rol claro; uno recibe, otro reparte, otro protege.
  • Protocolos de comunicación como HTTPS o gRPC, que dictan cómo se hablan los servicios.
  • Protocolos de API, los acuerdos que permiten que distintos sistemas se entiendan sin gritarse.
  • gRPC, por ejemplo, es rápido, eficiente y moderno. No es moda: es evolución.

Ejemplo: Balanceador mínimo (Nginx) - config esencial

- Objetivo: repartir tráfico entre instancias.

# nginx.conf (fragmento)
upstream app_servers {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
}

server {
    listen 80;
    location / {
        proxy_pass http://app_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
Enter fullscreen mode Exit fullscreen mode
  • Explicación: Nginx reparte peticiones y puede usar health checks; combina con API Gateway para seguridad y autenticación.

Arquitectura: dividir para conquistar

Los microservicios proponen una idea sencilla y poderosa: dividir una aplicación grande en servicios pequeños e independientes. Cada uno hace poco, pero lo hace bien. Eso sí, esta libertad exige disciplina.

Aquí entra la idempotencia en el diseño de APIs: repetir una acción no debería causar un desastre. Un pago duplicado, un pedido fantasma… errores así no son bugs menores, son traiciones al sistema. La idempotencia mantiene la cordura.

Ejemplo: Endpoint idempotente

  • Objetivo: evitar efectos duplicados si el cliente reintenta la misma petición.
// idempotent.js
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());

const processed = new Set(); // en producción usar DB

app.post('/charge', (req, res) => {
  const idempotencyKey = req.header('Idempotency-Key');
  if (!idempotencyKey) return res.status(400).send('Idempotency-Key required');

  if (processed.has(idempotencyKey)) {
    return res.status(200).send({status: 'already_processed'});
  }

  // procesar pago (simulado)
  processed.add(idempotencyKey);
  return res.status(201).send({status: 'processed'});
});

app.listen(3000);
Enter fullscreen mode Exit fullscreen mode
  • Explicación: usar una clave de idempotencia evita duplicados; en producción guarda la clave y resultado en una base de datos. Idempotencia es esencial en APIs de pago y pedidos.

Rendimiento y monitoreo: escuchar al sistema

Un sistema sano habla. Hay que saber escucharlo:

  • Caché en bases de datos para no preguntar lo mismo mil veces.
  • Atributos de calidad como escalabilidad, disponibilidad y mantenibilidad.
  • Health checks para saber si un servicio funciona.
  • Heartbeats para confirmar que sigue con vida.

Monitorear no es paranoia: es responsabilidad.

Ejemplo: Cache básico con Redis

  • Objetivo: reducir latencia y carga en la base de datos.
// cache.js
const express = require('express');
const redis = require('redis');
const client = redis.createClient();
const app = express();

app.get('/user/:id', async (req, res) => {
  const key = `user:${req.params.id}`;
  client.get(key, (err, data) => {
    if (data) return res.json(JSON.parse(data));
    // simula DB
    const user = {id: req.params.id, name: 'Orli'};
    client.setex(key, 60, JSON.stringify(user)); // TTL 60s
    res.json(user);
  });
});

app.listen(3001);
Enter fullscreen mode Exit fullscreen mode
  • Explicación: usar TTL evita datos obsoletos; cachear lecturas frecuentes mejora rendimiento y escalabilidad.

Seguridad y despliegue: el arte de no romperlo todo

  • La seguridad no es un "extra":
  • HTTPS cifra la comunicación. Punto.
  • JWT permite autenticar y autorizar de forma segura.
  • CI/CD automatiza despliegues para reducir errores humanos.

Un buen pipeline no acelera solo el desarrollo; protege al sistema de nosotros mismos.

El arte de decidir: los trade-offs

No existe el diseño perfecto. Solo decisiones conscientes. Más velocidad puede significar menos seguridad. Más simplicidad, menos flexibilidad. Aquí entran los patrones de arquitectura, no como dogma, sino como brújula.

  • Balanceo de carga y microservicios: una alianza inevitable
  • Los microservicios viven de escalar horizontalmente. Para eso necesitan balanceadores:
  • Reparten tráfico entre múltiples instancias.
  • Trabajan junto a un API Gateway como puerta de entrada.
  • Usan health checks para evitar enviar tráfico a servicios caídos.

Hay balanceo externo (desde internet) e interno (entre servicios). Sin ambos, los microservicios pierden su mayor ventaja.

Ejemplo: Health check simple

  • Objetivo: que orquestadores y balanceadores detecten servicios caídos.
# health.py
from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/health')
def health():
    # aquí podrías chequear DB, cache, etc.
    return jsonify(status='UP'), 200

if __name__ == '__main__':
    app.run(port=5000)
Enter fullscreen mode Exit fullscreen mode
  • Explicación: /health debe devolver UP/DOWN; los balanceadores y Kubernetes usan esto para no enviar tráfico a instancias malas.

Calidad y seguridad: dos caras de la misma moneda

La calidad se construye con:

  • Atributos bien definidos.
  • CI/CD confiable.
  • Monitoreo constante.
  • Gestión inteligente del tráfico y del rendimiento.

Y la seguridad se refuerza con estándares probados, no con ocurrencias.

Atributos de calidad: cómo se mide un buen diseño

Un sistema de calidad equilibra:

  • Escalabilidad
  • Disponibilidad
  • Mantenibilidad
  • Resiliencia

Todo esto se logra entendiendo los trade-offs, aplicando patrones y respetando principios que llevan décadas funcionando. Porque en tecnología, como en la arquitectura clásica, avanzar no es olvidar el pasado: es apoyarse en él para llegar más lejos.

Riesgos, trade-offs y buenas prácticas

  • Persistencia de idempotencia: usar una base de datos o almacén duradero, no Set en memoria.
  • Cache vs consistencia: cache mejora latencia pero puede servir datos viejos; usar TTL y invalidación.
  • Monitoreo y health checks: implementa checks que verifiquen dependencias (DB, Redis).
  • Seguridad: siempre HTTPS y autenticación (JWT) en producción.

Conclusión

Dicen, y con razón, que para construir bien hay que empezar por los cimientos. En tecnología eso no solo sigue vigente: es casi una ley natural. Diseñar sistemas sin fundamentos es como levantar una casa sin planos. Puede que aguante un tiempo, incluso que se vea bonita… hasta que cruje, se inclina y un día, sin avisar, falla.

Diseñar sistemas, al final, es un acto de responsabilidad. Con el código. Con los usuarios. Y con el futuro.

¡Gracias por acompañarme en esta aventura tech! 👩🏻‍🦰 👩🏻‍💻✨

🚀 ¿Te ha inspirado este contenido?
Me encantaría saber tu opinión o leer tus experiencias. 🧡

Si quieres explorar más de lo que estoy creando (proyectos, blogs, contenido tech y novedades en IA/ML), te invito a visitar:

Y si prefieres conectar directamente:

✨ Code with heart - Create with soul ✨

Referencias:

Imágenes creadas con Gemini (google.com)

porunmillondeamigos #makeyourselfvisible #creatorcontent #linkedin #developers #opentowork #SystemDesign #ArquitecturaDeSoftware #DrivenDevelopment #idempotencia #caché #HealthChecks

Top comments (0)