Resumen de Algoritmos y Paradigmas de Programación

Algoritmos y Paradigmas de Programación: Guía Completa

Introducción

La programación reactiva y concurrente es un enfoque para diseñar sistemas que procesan eventos y datos a lo largo del tiempo de forma no bloqueante, escalable y tolerante a fallos. Este material explica los conceptos clave de streams, operadores, contrapresión y características de sistemas reactivos, con ejemplos prácticos y aplicaciones reales.

Definición: Un stream es una secuencia de eventos o valores que se producen a lo largo del tiempo y puede incluir valores, errores y señales de completitud.

Conceptos fundamentales

Streams y el patrón observable

  • Un stream representa datos que aparecen en distintos momentos (entradas de usuario, sensores, respuestas de red).
  • El patrón observable: una fuente emite eventos y varios observadores pueden suscribirse para recibirlos (relación uno-a-muchos).

Definición: Observable es una abstracción que permite suscribirse a un stream para recibir notificaciones sobre nuevos valores, errores o completitud.

Operadores básicos sobre streams

  • Map: transforma cada elemento aplicando una función.
  • Filter: deja pasar solo elementos que cumplen un predicado.
  • Merge: combina múltiples streams en uno solo, preservando emisiones conforme ocurren.
  • Combine: crea un stream nuevo basado en los valores más recientes de varios streams.
  • Debounce: emite un elemento solo si ha pasado un periodo sin nuevas emisiones.
  • Throttle: limita la frecuencia de emisiones.

Definición: Operador es una función que toma uno o más streams y devuelve un nuevo stream transformado.

Contrapresión (backpressure)

  • Problema: el productor puede emitir datos más rápido de lo que el consumidor procesa.
  • Soluciones/estrategias: buffer, sample, throttle, drop, solicitar menos (pull) o ajustar la velocidad del productor.

Definición: Contrapresión es el mecanismo por el cual el consumidor comunica su capacidad al productor para evitar sobrecarga.

Características de sistemas reactivos (principios)

  • Responsivos: permanecen responsivos bajo cargas y fallos.
  • Resilientes: aíslan y contienen fallos para recuperarse sin degradación general.
  • Elásticos: escalan horizontalmente según la demanda.
  • Orientados a mensajes: usan comunicación asincrónica y no bloqueante entre componentes.

Tabla comparativa: características vs beneficio

CaracterísticaBeneficio principal
ResponsivoMejora la experiencia de usuario y SLOs
ResilienteContención de fallos y recuperación local
ElásticoEscalado eficiente frente a picos
Orientado a mensajesAislamiento y mejor tolerancia a fallos

Ejemplos prácticos

Ejemplo: Stream de lecturas de temperatura

// Creación de un stream de lecturas de temperatura
streamDeTemperatura = crearObservable(función(emisor) {
  // Emite temperatura periódicamente
  cada(1000, función() {
    temperatura = obtenerTemperaturaDelSensor()
    emisor.emitir(temperatura)
  })
})

// Suscripción al stream
streamDeTemperatura.suscribir(
  función(temperatura) {
    if (temperatura > 30) { activarAlarma() }
    actualizarInterfazUsuario(temperatura)
  },
  función(error) { registrarError("Error en sensor de temperatura", error) }
)
  • Observaciones: el código suscriptor reacciona de forma asincrónica sin solicitar activamente las lecturas.

Ejemplo: Monitoreo de tráfico urbano (flujo complejo)

// Definición de streams de datos de sensores
sensorStream = combinarStreams([
  obtenerStreamDeSensor("sector-norte"),
  obtenerStreamDeSensor("sector-sur"),
  obtenerStreamDeSensor("sector-este"),
  obtenerStreamDeSensor("sector-oeste")
])

informeTrafico = sensorStream
  .agruparPor(sensor => sensor.ubicación)
  .transformar(grupo => {
    return {
      ubicación: grupo.clave,
      densidadTráfico: calcularDensidad(grupo.valores),
      velocidadPromedio: calcularPromedio(grupo.valores.map(v => v.velocidad)),
      timestamp: ahora()
    }
  })
  .
Regístrate para el resumen completo
TarjetasTest de conocimientosResumenPodcastMapa mental
Empezar gratis

¿Ya tienes cuenta? Iniciar sesión

Reactiva y Concurrente

Klíčová slova: Paradigmas de programación y algoritmos, Algoritmos de ordenamiento y búsqueda, Recursividad, Programación funcional, Programación reactiva y concurrente, Eficiencia algorítmica, Programación, Programación orientada a objetos, Algoritmos y estructuras de datos

Klíčové pojmy: Un stream es una secuencia temporal de valores, errores y completitud., Observable: suscripción uno-a-muchos para recibir eventos de un stream., Map y Filter transforman y filtran elementos de un stream respectivamente., Merge combina emisiones de varios streams en uno solo., Combine crea emisiones a partir de los valores más recientes de varios streams., Contrapresión permite al consumidor comunicar su capacidad al productor., Sistemas reactivos son responsivos, resilientes, elásticos y orientados a mensajes., Usa debounce y throttle para controlar la frecuencia de emisiones., Bibliotecas comunes: Rx, Akka, Project Reactor, Spring WebFlux., En entornos pequeños, la sobrecarga reactiva puede no justificarse.

## Introducción La **programación reactiva y concurrente** es un enfoque para diseñar sistemas que procesan eventos y datos a lo largo del tiempo de forma no bloqueante, escalable y tolerante a fallos. Este material explica los conceptos clave de streams, operadores, contrapresión y características de sistemas reactivos, con ejemplos prácticos y aplicaciones reales. > Definición: Un *stream* es una secuencia de eventos o valores que se producen a lo largo del tiempo y puede incluir valores, errores y señales de completitud. ## Conceptos fundamentales ### Streams y el patrón observable - Un **stream** representa datos que aparecen en distintos momentos (entradas de usuario, sensores, respuestas de red). - El patrón **observable**: una fuente emite eventos y varios observadores pueden suscribirse para recibirlos (relación uno-a-muchos). > Definición: Observable es una abstracción que permite suscribirse a un stream para recibir notificaciones sobre nuevos valores, errores o completitud. ### Operadores básicos sobre streams - **Map**: transforma cada elemento aplicando una función. - **Filter**: deja pasar solo elementos que cumplen un predicado. - **Merge**: combina múltiples streams en uno solo, preservando emisiones conforme ocurren. - **Combine**: crea un stream nuevo basado en los valores más recientes de varios streams. - **Debounce**: emite un elemento solo si ha pasado un periodo sin nuevas emisiones. - **Throttle**: limita la frecuencia de emisiones. > Definición: Operador es una función que toma uno o más streams y devuelve un nuevo stream transformado. ### Contrapresión (backpressure) - Problema: el productor puede emitir datos más rápido de lo que el consumidor procesa. - Soluciones/estrategias: buffer, sample, throttle, drop, solicitar menos (pull) o ajustar la velocidad del productor. > Definición: Contrapresión es el mecanismo por el cual el consumidor comunica su capacidad al productor para evitar sobrecarga. ## Características de sistemas reactivos (principios) - **Responsivos**: permanecen responsivos bajo cargas y fallos. - **Resilientes**: aíslan y contienen fallos para recuperarse sin degradación general. - **Elásticos**: escalan horizontalmente según la demanda. - **Orientados a mensajes**: usan comunicación asincrónica y no bloqueante entre componentes. Tabla comparativa: características vs beneficio | Característica | Beneficio principal | |---|---| | Responsivo | Mejora la experiencia de usuario y SLOs | | Resiliente | Contención de fallos y recuperación local | | Elástico | Escalado eficiente frente a picos | | Orientado a mensajes | Aislamiento y mejor tolerancia a fallos | ## Ejemplos prácticos ### Ejemplo: Stream de lecturas de temperatura ```javascript // Creación de un stream de lecturas de temperatura streamDeTemperatura = crearObservable(función(emisor) { // Emite temperatura periódicamente cada(1000, función() { temperatura = obtenerTemperaturaDelSensor() emisor.emitir(temperatura) }) }) // Suscripción al stream streamDeTemperatura.suscribir( función(temperatura) { if (temperatura > 30) { activarAlarma() } actualizarInterfazUsuario(temperatura) }, función(error) { registrarError("Error en sensor de temperatura", error) } ) ``` - Observaciones: el código suscriptor reacciona de forma asincrónica sin solicitar activamente las lecturas. ### Ejemplo: Monitoreo de tráfico urbano (flujo complejo) ```javascript // Definición de streams de datos de sensores sensorStream = combinarStreams([ obtenerStreamDeSensor("sector-norte"), obtenerStreamDeSensor("sector-sur"), obtenerStreamDeSensor("sector-este"), obtenerStreamDeSensor("sector-oeste") ]) informeTrafico = sensorStream .agruparPor(sensor => sensor.ubicación) .transformar(grupo => { return { ubicación: grupo.clave, densidadTráfico: calcularDensidad(grupo.valores), velocidadPromedio: calcularPromedio(grupo.valores.map(v => v.velocidad)), timestamp: ahora() } }) .