lifekairos

Introducción

En sistemas donde el volumen de datos a procesar supera la velocidad de procesamiento pueden aparecer problemas como saturación, latencia elevada o pérdida de información. Gestionar correctamente estos escenarios es clave para construir sistemas estables y confiables y preparados para picos de carga.

Para ello tenemos herramientas como el Backpressure que nos permiten regular de forma controlada el flujo de datos y evitar saturaciones.

Backpressure

Backpressure es un conjunto de mecanismos que nos permiten regular la velocidad a la que un productor envía los datos y un consumidor los procesa, evitando la saturación del sistema, que se produzcan bloqueos y/o caídas del servicio o haya pérdida de información.

¿Cómo funciona?

Imaginemos un cruce de calles con semáforos. Si todos los coches intentan pasar al mismo tiempo, la calle se llenaría de vehículos yendo en distintas direcciones, colapsándola.

Imaginemos un cruce de calles con semáforos.

Para evitar esto, los semáforos regulan el paso haciendo que unos continúen su camino mientras otros esperan.

Para evitar esto, los semáforos regulan el paso haciendo que unos continúen su camino mientras otros esperan.

Backpressure funciona de forma similar a los semáforos. El consumidor (la calle) monitoriza su carga de trabajo y, cuando está llegando a su límite, envía una señal (las luces de los semáforos) al productor (los conductores) para que ajuste el flujo de datos, modificando  la velocidad a la que manda la información (los coches) o, incluso, detenga el envío.

Al igual que con los semáforos, esto funciona en un bucle continuo en el cual emisor y receptor “hablan” para calibrar el tráfico, ayudando a evitar pérdidas de datos y permitiendo que el sistema funcione con normalidad.

Beneficios

Ahora que entendemos su funcionamiento, podemos apreciar los beneficios que nos ofrece:

  • Evita que el sistema se congestione, ya que regula el flujo de datos para que no colapse.
  • Reduce la pérdida de información que se mandan a través de buffers, eventos, colas o llamadas a APIs.
  • Ayuda a optimizar los recursos de los componentes del sistema (CPU, memoria, red), asignando los necesarios para procesar los datos que lleguen.
  • Facilita que los sistemas escalen, evitando la saturación de los nodos y distribuyendo la carga de trabajo.

Complejidades

A pesar de sus ventajas, su implementación puede presentar algunos de estos retos:

  • Cuáles son las técnicas más óptimas para resolver nuestro problema y el nivel o parte del sistema donde aplicarlas.
  • Qué pruebas y validaciones debemos diseñar y realizar, que pueden ser complejas de dimensionar, para observar cómo reacciona lo que hemos implementado. Un mal ajuste podría agravar el problema que queremos mitigar.
  • Cuál es la forma de comunicación entre el emisor y el receptor para coordinar sus ritmos. Esto se podría hacer con señales, notificaciones, protocolos…
  • Añadir estos mecanismos podría impactar en la experiencia de usuario, ya que pueden ralentizar el envío y la muestra de la información y la navegación.

Tipos de backpressure

Debemos tener en cuenta que dependiendo del objetivo que perseguimos, unas técnicas de backpressure son más eficaces que otras e incluso se pueden combinar para mayor efectividad.

Podemos organizar todas estas técnicas en tres grandes grupos:

Control

Las técnicas de este grupo se centran en regular la cantidad de datos a procesar. El consumidor se comunica continuamente con el productor para informarle de su estado y cuántos datos puede procesar o si debe detenerse.

La principal ventaja de estas técnicas es que evitan que se colapse el sistema antes de que ocurra. Sin embargo, requiere coordinación por ambas partes para que se mantengan sincronizados, lo que puede añadir cierta complejidad.

A este grupo pertenecen las siguientes técnicas.

Rate Limiting

Es una técnica que permite controlar y limitar la cantidad de peticiones que el productor realiza al consumidor en un tiempo determinado. Su objetivo es proteger al sistema para que no se sature y se caiga. 

Cuando se supera el límite de peticiones a procesar durante un tiempo, el servicio responderá con el código HTTP 429 (Too Many Requests).

Esta técnica se utiliza comúnmente para limitar el consumo de APIs.

Windowing

Consiste en agrupar los datos en ventanas de tiempo o de cantidad controladas para regular el ritmo de procesamiento. Su objetivo es manejar de forma más eficaz los flujos continuos de datos, pero puede producir cierta latencia en el sistema.

Se suele utilizar en sistemas de procesamiento de datos en streaming, como en colas de Kafka o RabbitMQ, donde controlar el volumen de datos a procesar es crucial.

Pull-Based

Este mecanismo se basa en que el consumidor controla la cantidad de datos que quiere recibir del productor. Es la ideal ya que evita completamente la saturación del sistema, haciendo que la recepción sea estable y predecible.

Un ejemplo claro, al igual que en la anterior, es cuando un consumidor de una cola solicita consumir cierta cantidad de elementos que tiene el productor.

Adaptive o Feedback control

Consiste en que el productor ajusta dinámicamente la velocidad de envío de datos según la capacidad del consumidor. Este ajuste se realiza en base a métricas o señales mandadas al consumidor, evitando sobrecargar el sistema. 

Hay que considerar que puede ser complejo ya que requiere monitoreo continuo del servicio a consumir y controlar la variabilidad de la cantidad de datos que el consumidor puede procesar.

Un ejemplo donde se suele utilizar esta técnica, es en aplicaciones de mensajería donde el volumen de datos es muy variable.

Buffer

Las estrategias de tipo buffer consisten en asumir que habrá picos de carga temporales almacenando los datos, ya sea en memoria o en soportes auxiliares, como paso intermedio hasta que puedan ser procesados.

Este tipo de mecanismos son los más comunes de implementar y permiten que el productor envíe datos continuamente mientras que el consumidor los procesa a su ritmo. Aunque hay que controlar el límite del buffer para que no se sature.

Dentro de este tipo pertenecen las siguientes técnicas:

Queueing

Consiste en poner una cola entre el productor y el consumidor para que el productor pueda escribir los datos y el consumidor leerlos a diferentes velocidades.

Con esto, se suavizan los picos de carga que haya pero es importante limitar el buffer para evitar que se sature la memoria.

Este enfoque es una de las bases de las tecnologías de colas de eventos, como Kafka o RabbitMQ entre otras.

Batching

Se trata de agrupar múltiples elementos para procesarlos de manera conjunta, reduciendo el número de llamadas. Sin embargo, esta técnica puede incrementar los tiempos de respuesta y no es adecuada para sistemas que necesitan procesamiento en tiempo real.

Aunque es muy similar al windowing, comentado anteriormente, la diferencia principal es que el batching se centra en determinar la forma óptima de procesar los datos mientras que el windowing se enfoca en qué datos se agrupan según el tiempo. Normalmente, ambas técnicas se suelen combinar.

Drop

Los mecanismos de tipo drop, son los más agresivos ya que priorizan la estabilidad del sistema por encima de la pérdida de información.

Shedding

Es una estrategia en la cual se descartan intencionalmente solicitudes, datos o eventos cuando la carga del sistema excede su capacidad de procesamiento. Su objetivo es proteger la estabilidad y disponibilidad del sistema.

Por ejemplo, cuando se ejecuta una consulta en base de datos que es muy costosa, el sistema la puede detener para evitar que se sature.

Sampling

Es una técnica en la cual consiste en procesar una parte de los datos que llegan al sistema, descartando el resto de manera controlada. Aunque reduce el uso de recursos, implica pérdida de información y resultados aproximados.

Por norma general se suele utilizar en escenarios de métricas de tiempo, monitorización o análisis de gran volumetría. 

Librerías

Backpressure no depende de un lenguaje de programación. La siguiente tabla muestra algunas librerías disponibles en distintos lenguajes para implementarlo, aunque existen muchas más.

Lenguaje Técnica de Backpressure Framework / Librería
Java Circuit Breaker / Rate Limiting Resilience4j
Java Rate Limiting Bucket4j
Java Pull-based / Buffer RxJava
Scala Pull-based / Feedback control / Adaptive / Buffer Akka
C# / .NET Pull-based / Feedback control / Adaptive / Buffer Akka.NET
Python Pull-based / Buffer RxBP
Go Pull-based / Buffer bradenaw/backpressure
Go Pull-based / Buffer go-backpressure

Conclusión

Backpressure no es una solución única para todos los casos, sino un conjunto de estrategias para balancear el flujo de datos entre productores y consumidores.

Si bien su implementación puede ser retadora, los beneficios que aportar superan su dificultad. De este modo, podemos construir sistemas que sean conscientes de sus límites y capaces de escalar de forma más estable.

Ene 27, 2026

Otros artículos