Diferencias entre servidor, serverless y contenedor — la capa de servidor de aplicaciones

Este artículo forma parte del curso Fundamentos de informática, que construye desde cero los conocimientos prácticos de informática que necesitas como mínimo para programar y hacer vibe coding.
La diferencia está en el tiempo que el programa que hace el trabajo está en marcha. Con diagramas aprendes a distinguir la forma que queda arrancada esperando, la que se ejecuta solo cuando llega una solicitud y los contenedores, que se ejecutan con su propio entorno de ejecución sobre un solo sistema operativo.

Este artículo trata las tres formas de ejecutar la capa de servidor de aplicaciones.

Son el modo siempre activo, que mantiene arrancado un servidor; serverless, que se ejecuta solo cuando llega una solicitud; y los contenedores.

La diferencia está en el tiempo que el programa que hace el trabajo está en marcha.

Como ese tiempo cambia, también cambian la forma de aumentar la capacidad cuando llegan más solicitudes y lo que tienes que preparar tú.

Tres formas de ejecutarlo, separadas por el tiempo que están en marcha
Ejecutar la capade aplicacionesSigue en marchasin solicitudesSolo cuando llegauna solicitudSiempre activoContenedorServerless
Del único nodo de la izquierda, la separación es si tiene que estar en marcha cuando no hay solicitudes. Arriba sigue en marcha; abajo se ejecuta solo cuando lo llaman.

El servidor siempre activo queda arrancado y espera las solicitudes

No sabes cuándo llegará una solicitud, así que arrancas server.js antes y lo dejas esperando como proceso (process: un programa que se ha arrancado y está en marcha).

Dejar ese proceso ahí en lugar de terminarlo es lo que se llama siempre activo (always-on: mantener el programa arrancado para poder aceptar una solicitud en cualquier momento).

Server listening on port 3000
Press Ctrl+C to stop

La primera línea muestra que está escuchando solicitudes en el puerto que elegiste.

Como dice la segunda línea, el proceso no termina hasta que haces algo para detenerlo.

Lo que llegó a esa horaEl proceso de server.jsLo que vuelve a la capa Web
9:00 lo arrancasArranca y se pone a escucharTodavía no vuelve nada
9:05 una solicitud a /reservationsLa recibe tal cual y consulta las reservas3 reservas
9:06 no llega nadaSigue esperando en vez de terminarNo vuelve nada
Lo que hay dentro de un servidor que sigue en marcha
La computadora que mantienes en marcha
El proceso de node (arrancado con node server.js)
  • Escucha solicitudes en el puerto 3000
  • No termina hasta que haces algo para detenerlo
server.js — el archivo con el procesamiento de la app de reservas
  • Contiene el manejo de las solicitudes que llegan a /reservations
  • Consulta a la capa de base de datos cuántas reservas hay
El sistema operativo y el node que instalaste tú
  • El node lo instalas desde el sitio oficial
  • Las actualizaciones del sistema operativo también las haces tú
El marco exterior es la computadora que mantienes en marcha. Dentro escucha el proceso de node, y dentro de él está cargado el server.js que escribiste.

Lo que preparas tú no es solo el server.js del interior.

También preparas la computadora que mantienes en marcha, el sistema operativo que corre en ella y node.

Esta es la gran diferencia con serverless, que viene a continuación.

Dentro del marco está la única máquina que preparas y mantienes en marcha.

El proceso no termina mientras no llegan solicitudes: espera con el puerto abierto.

Siempre activo significa en marcha hasta que lo detienes

Un servidor siempre activo es uno que arrancas de antemano y dejas esperando a que lleguen solicitudes.

Lo que lo arranca es node server.js, el proceso no termina hasta que haces algo para detenerlo, y la computadora que mantienes en marcha, el sistema operativo y node los preparas tú.

Serverless ejecuta el procesamiento solo cuando llega una solicitud

En serverless (serverless: el modo en el que el programa que hace el trabajo se ejecuta solo cuando llega una solicitud y se detiene cuando el trabajo termina) no eres tú quien mantiene en marcha un proceso a la espera.

Lo que registras es un solo archivo, como handler.js, y a esa unidad de registro se le llama «función».

En serverless, qué prepara el proveedor y qué pones tú
El sistema del proveedor de nube
La parte que recibe la solicitud y llama a la función
  • Recibe las solicitudes que llegan
  • Decide cuántas se ejecutan a la vez
El entorno de ejecución que se prepara para cada solicitud
  • El proveedor prepara el sistema operativo y node
  • Se detiene cuando el trabajo termina
handler.js — el archivo con el procesamiento de la app de reservas
  • Procesa solo la solicitud que llegó a /reservations
  • Hay un límite de tiempo para su ejecución
El marco exterior es el sistema del proveedor de nube. El marco superior es la parte que recibe las solicitudes, y está siempre en marcha. El marco inferior es el entorno de ejecución que se prepara para cada solicitud, y dentro está tu handler.js.

Lo único que tocas es el handler.js del interior.

Los marcos de fuera los prepara el proveedor, que también aplica las actualizaciones del sistema operativo y de node.

Quién prepara qué se trata en el artículo sobre on-premises, hosting compartido y la nube.

Mientras no llega ninguna solicitud, handler.js no está en marcha.

El entorno de ejecución se prepara para cada solicitud y se detiene cuando termina de responder.

Esta es la diferencia con el modo siempre activo, que sigue en marcha hasta que lo detienes.

Serverless se ejecuta solo cuando lo llaman

Serverless es el modo que arranca el procesamiento después de que llega una solicitud y lo detiene cuando termina de responder.

Lo único que pones tú es handler.js, y el entorno de ejecución que lo ejecuta lo prepara el proveedor en cada solicitud.

La forma de aumentar la capacidad cuando crecen las solicitudes simultáneas es distinta

El número de solicitudes que llegan a la vez cambia según la hora del día.

Ajustarse a eso es el escalado (scaling: aumentar o reducir el número de elementos que hacen el trabajo según el volumen de solicitudes).

Vamos a ver primero el caso de tres solicitudes que llegan a la vez a serverless.

Si llegan tres a la vez, se arrancan también tres entornos de ejecución
Solicitud de A a/reservationsSolicitud de B a/reservationsSolicitud de C a/reservationsParte receptoradel proveedorEntorno 1ejecuta handler.jsEntorno 2ejecuta handler.jsEntorno 3ejecuta handler.js
Las tres de la izquierda son solicitudes al mismo /reservations. Después de que el centro las recibe, se prepara un entorno de ejecución por cada solicitud.

Hasta el número que el proveedor permite ejecutar a la vez, ninguna solicitud queda esperando.

Tampoco haces tú nada para aumentar la capacidad.

Un servidor siempre activo necesita cubrir las mismas funciones, pero cambia quién las cubre.

Qué cumple la misma función en siempre activo y en serverless
===EsperarsolicitudesEl proceso de nodeespera en el 3000La parte receptoradel proveedorHacer el trabajoserver.js dentrodel mismo procesoPrepara un entornopara handler.jsAumentar el númeroAñades procesos omáquinas tú mismoEl proveedor losaumenta a la vez
La columna de la izquierda es la función, la del centro el servidor siempre activo y la de la derecha serverless. Los dos unidos por la línea doble hacen lo mismo; solo cambia quién lo hace.

Lo que cambia es si decides tú aumentar la capacidad o lo dejas en manos del sistema del proveedor.

Una vez que el número ha crecido, las solicitudes de una misma persona no siempre llegan al mismo sitio, así que se necesita que sea sin estado (stateless: que una ejecución del procesamiento no guarde valores recordados de la ejecución anterior).

Que la segunda solicitud pueda leer un valor que recordó la primera depende de dónde pusiste ese valor.

El valor que también usas en la siguiente solicitud se guarda en la capa de base de datos y se lee desde ahí.

En un servidor siempre activo pasa lo mismo: si añades procesos, el valor no queda en los otros procesos.

Cómo se aumenta la capacidad y dónde se guardan los valores

Cuando crecen las solicitudes simultáneas, en siempre activo aumentas tú el número y en serverless lo aumenta el sistema del proveedor.

Una vez que el número ha crecido, no siempre responde el mismo a las dos solicitudes de una misma persona, así que el valor que quieras volver a usar va a la capa de base de datos y no a la memoria local.

Los contenedores se ejecutan sobre un solo sistema operativo, y eliges entre los tres según si necesitas estar siempre activo

La tercera forma, el contenedor (container: un formato que empaqueta la app, su entorno de ejecución y los archivos que necesita, y la ejecuta en otra computadora con la misma configuración), está en marcha el mismo tiempo que un servidor siempre activo.

Lo que cambia es que el entorno de ejecución no se instala en la computadora, sino que se empaqueta junto con la app.

Las mismas tres apps en tres máquinas y en contenedores sobre una sola
Una máquina preparada por app
Lo que preparas
  • Tres computadoras
  • Tres sistemas operativos
  • Node.js 18 / Python 3.11 / Node.js 20 instalados en máquinas distintas
Una máquina compartida con contenedores
Una computadora, un sistema operativo — tres contenedores se ejecutan encima
Contenedor 1
  • Un proceso
  • Node.js 18
  • server.js
Contenedor 2
  • Un proceso
  • Python 3.11
  • batch.py
Contenedor 3
  • Un proceso
  • Node.js 20
  • admin.js
Arriba se prepara una máquina por app, así que hacen falta tres equipos y tres sistemas operativos. Abajo, tres contenedores se ejecutan como un proceso cada uno sobre un solo sistema operativo, así que basta con un equipo y un sistema operativo.

Hay un solo sistema operativo, y cada contenedor se ejecuta encima como un único proceso.

Los entornos de ejecución están por separado dentro de cada contenedor, así que lo que use el contenedor de al lado no le afecta.

Lo que se consume del equipo para ejecutar algo, como la CPU y la memoria, son los recursos (resource).

Arriba se ejecutan tres sistemas operativos, mientras que abajo se comparte uno solo, así que en el mismo equipo caben más apps.

Puedes ejecutar más con el mismo número de máquinas y cuesta menos mantenerlas en marcha.

Como no se arranca un sistema operativo nuevo, también es más corto el tiempo hasta que empieza a funcionar.

Al ejecutar dos en la misma máquina, dónde pongas el entorno de ejecución cambia el resultado
Quieres Node 18 yNode 20 en lamisma máquinaEntorno instaladoen el sistemaSolo cabe un nodepor máquinaHay que quedarsecon uno de los dosEntorno y appen un contenedorCada contenedortiene su nodeLos dos convivental cual
A la izquierda está lo que quieres ejecutar. El camino de arriba instala el entorno de ejecución en la computadora; el de abajo lo empaqueta en un contenedor. En la misma máquina, dónde lo pongas cambia el resultado.

Un solo sistema operativo admite un solo node, pero con contenedores puedes tener los dos a la vez con nodes distintos.

Como el entorno de ejecución está separado por app, si subes la versión de uno el otro sigue funcionando.

El conjunto de archivos empaquetados es la imagen de contenedor (container image: la app, el entorno de ejecución y los archivos necesarios empaquetados en uno), y el software más conocido para crearla y ejecutarla es Docker.

Quien la ejecuta solo recibe esta imagen y la arranca.

La misma imagen da la misma configuración la ejecutes donde la ejecutes
App, entorno y losarchivos que usaUna sola imagende contenedorTu computadoraServidor públicoPC del compañero
La imagen de contenedor son los tres de la izquierda empaquetados en uno. Los tres lugares de la derecha arrancan esa imagen tal cual, así que no hace falta volver a instalar el entorno de ejecución.

Aunque cambie el lugar donde la ejecutas, lo que se arranca es la misma imagen.

No hace falta volver a instalar el entorno de ejecución en el servidor público, así que puedes publicar la misma configuración que funcionó en tu equipo.

El punto que separa la elección es si tiene que estar en marcha cuando no hay solicitudes.

El otro punto de separación es cuánto cabe en un solo equipo.

Según si necesitas estar siempre activo, las tres formas se separan
Trabajo a ejecutarDebe estar activosin solicitudesEl entorno vaen la computadoraServidorsiempre activoEntorno y appen un paqueteContenedorBasta respondera las solicitudesEjecutar solocuando lo llamanServerless
Del único nodo de la izquierda, la separación es si tiene que estar en marcha cuando no hay solicitudes. Las dos líneas de arriba siguen en marcha desde que arrancan y la de abajo empieza a ejecutarse cuando llega una solicitud.

En las dos líneas de arriba, el proceso sigue en marcha incluso cuando no hay solicitudes.

Esas dos se separan según si el entorno de ejecución se instala en la computadora o se empaqueta junto con la app.

Las dos formas siempre activas siguen en marcha también durante el tiempo en que no llegan solicitudes.

En serverless solo se cuentan el tiempo que estuvo en marcha y las veces que se le llamó.

Mientras las solicitudes son escasas, esa diferencia se nota directamente.

Elige por el tiempo que está en marcha

La primera separación es si tiene que estar en marcha cuando no hay solicitudes.

Si no hace falta, serverless; si hace falta, un servidor siempre activo o un contenedor.

Los contenedores comparten un solo sistema operativo entre apps, así que caben muchos en el mismo equipo y baja el costo de mantenerlos en marcha.

También eliges un contenedor cuando quieres que la configuración de tu equipo y la del servidor publicado coincidan.

QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿En qué se diferencia el tiempo que el programa que hace el trabajo está en marcha entre un servidor siempre activo y serverless?

Pregunta 2¿Cuándo usas un contenedor?

Pregunta 3¿Qué haces cuando quieres usar también en la siguiente solicitud un valor que pusiste en memoria a mitad del procesamiento?