Saltar al contenido

Tecnología · Concurrencia en Rust

Servicios concurrentes en Rust con Tokio

Tokio es la base sobre la que se escribe en Rust casi todo lo que hace varias cosas a la vez: atender conexiones, hablar con aparatos, mover ficheros, esperar respuestas. Permite que un solo programa lleve miles de tareas en curso con muy pocos recursos. Lo usamos para servicios que no pueden pararse y para el trabajo en segundo plano de las apps de escritorio.

Se combina con

Fig. 01Rotonda de tareasPARADA34251UN PUENTE · MUCHAS VÍASEn bucle
Un solo puente giratorio atiende a todas las vías: se detiene en la que tiene la luz encendida y no espera a la que no contesta. A esa se le acaba el tiempo en el reloj, y la palanca detiene el servicio con orden.

Situaciones

Qué puedes resolver con Tokio

Tokio compensa cuando un programa pasa la mayor parte del tiempo esperando, a la red, al disco o a una máquina, y no puede permitirse que una espera detenga a las demás.

  • Muchos aparatos y un solo programa

    Decenas o cientos de sensores, lectores o máquinas que envían datos cuando quieren. Cada uno es una tarea ligera; el que tarda no retrasa a los demás.

  • Un servicio que se queda colgado

    Una petición lenta bloquea el resto, o una conexión que no responde deja el programa esperando para siempre. Aquí cada espera lleva su tiempo máximo y su forma de cancelarse.

  • Trabajo en segundo plano dentro de una app

    Sincronizar, importar un fichero grande o vigilar una carpeta mientras la persona sigue trabajando, sin que la ventana se congele.

  • Datos que tienen que llegar al momento

    Telemetría, avisos o cambios que se envían según ocurren, por una conexión abierta, a muchos clientes a la vez.

Dos vías: la que está lista recibe al puente; la otra espera sin ocuparlo

Qué conviene revisar al empezar

  • Cuántas conexiones o aparatos hay a la vez y cuánto tarda cada uno en responder
  • Qué debe pasar cuando uno no contesta
  • Qué trabajo es de espera y cuál de cálculo intensivo
  • Cómo se detiene el servicio sin perder lo que estaba a medias

Servicios

Qué desarrollamos con Tokio

Cuatro tipos de encargo. Los cuatro son el mismo oficio: que un programa haga muchas cosas a la vez sin que ninguna tumbe a las demás.

  • Módulo 1 · Vías

    Servicios con muchas conexiones

    Programas que mantienen abiertas muchas conexiones a la vez, con aparatos, con clientes o con otros sistemas, y reparten el trabajo sin que una bloquee a otra.

    Ejemplos de entregables

    • Concentrador de lecturas de sensores
    • Pasarela entre máquinas y servidor
    • Servicio de mensajería interna
  • Módulo 2 · Puente giratorio

    Trabajo en segundo plano y colas

    Tareas que corren mientras la aplicación sigue respondiendo: importaciones, sincronización, vigilancia de carpetas, con su cola, su límite de trabajos simultáneos y su progreso.

    Ejemplos de entregables

    • Importación de ficheros grandes
    • Sincronización con el servidor
    • Cola de trabajos con límite
  • Módulo 3 · Canal

    Tiempo real y flujos de datos

    Datos que pasan de una tarea a otra por canales y salen hacia fuera según llegan, con control para que quien produce no desborde a quien consume.

    Ejemplos de entregables

    • Panel con datos en vivo
    • Reenvío de eventos por WebSocket
    • Procesado de un flujo continuo
  • Módulo 4 · Reloj

    Tiempos de espera, reintentos y parada

    Lo que distingue un servicio que aguanta de uno que hay que reiniciar: cada espera tiene límite, cada fallo su reintento medido y el apagado termina lo que está a medias.

    Ejemplos de entregables

    • Tiempo máximo por operación
    • Reintentos con espera creciente
    • Apagado sin perder trabajo

Un ejemplo en funcionamiento

Dieciséis aparatos y uno que no contesta

Demostración simulada. Dieciséis aparatos envían una lectura cada uno; el número 7 no responde. Lanza la ronda atendiéndolos de uno en uno y luego a la vez, con y sin tiempo máximo de espera.

Demostración simulada · datos de muestra

Cómo se atienden

Resultado de la ronda

Elige cómo atenderlos y lanza la ronda.

Aparatos

  1. Aparato 1en espera
  2. Aparato 2en espera
  3. Aparato 3en espera
  4. Aparato 4en espera
  5. Aparato 5en espera
  6. Aparato 6en espera
  7. Aparato 7en espera
  8. Aparato 8en espera
  9. Aparato 9en espera
  10. Aparato 10en espera
  11. Aparato 11en espera
  12. Aparato 12en espera
  13. Aparato 13en espera
  14. Aparato 14en espera
  15. Aparato 15en espera
  16. Aparato 16en espera

Los aparatos y sus retrasos están simulados en tu navegador. Lo que cambia entre un modo y otro es lo que cambia en un servicio real: quién espera a quién, y qué pasa cuando alguien no contesta.

Integración

Cómo encaja con tus sistemas

Tokio no se ve: es lo que hay debajo de un servicio o de una app cuando hacen varias cosas a la vez. Alrededor están quienes le hablan y a quienes responde.

De dónde viene

  • Aparatos y sensoreslecturas cuando ocurren
  • Clientes y otras appsconexiones abiertas
  • Ficheros y colastrabajo pendiente
TokioServicio en Rust con Tokiomuchas tareas, pocos recursos

A dónde llega

Dependencias que conviene revisar

  • Qué bibliotecas de los aparatos o servicios son asíncronas y cuáles bloquean
  • Dónde hay cálculo pesado que deba ir a hilos aparte
  • Qué métricas y trazas hacen falta para ver qué está pasando
  • Cómo se despliega y quién lo vigila

Cómo trabajamos y qué entregamos

Cómo trabajamos un encargo con Tokio

  1. 01

    Revisión inicial

    Miramos qué tiene que atender el servicio a la vez, cuánto tarda cada cosa y qué falla hoy bajo carga.

  2. 02

    Alcance

    Escribimos las tareas, sus límites, qué pasa cuando algo no responde y cómo se apaga; y lo que queda fuera.

  3. 03

    Primera entrega

    El servicio funcionando con tus aparatos, o con una simulación fiel de ellos, y sus métricas a la vista.

  4. 04

    Validación

    Lo pruebas con carga real, desconectando aparatos y cortando la red a mitad.

  5. 05

    Documentación

    El mapa de tareas, los límites elegidos y por qué, y cómo leer las métricas.

Qué recibes al cerrar el encargo

  • El código del servicio en tu repositorio, con sus pruebas
  • El ejecutable o la imagen para desplegarlo
  • Un panel o un registro donde ver qué está haciendo
  • La lista de lo que queda fuera y por qué

Preguntas

Preguntas sobre Tokio

¿Falta la tuya? Escríbela a info@veodar.com y te respondemos con una pregunta concreta, no con un dossier.

¿Qué es exactamente Tokio?

Es una biblioteca de Rust, la más usada para programación asíncrona. Se ocupa de repartir muchas tareas entre pocos hilos del procesador, de modo que una tarea que está esperando no ocupa a nadie. Sobre ella están construidos la mayoría de los servidores, clientes de base de datos y bibliotecas de red del ecosistema.

¿Lo necesita mi aplicación de escritorio?

Si hace algo más que mostrar formularios, casi seguro: sincronizar, hablar con un aparato o importar un fichero sin congelar la ventana es trabajo asíncrono. En una app hecha con Tauri, Tokio ya viene debajo.

¿En qué se diferencia de hacerlo con Node.js?

La idea es parecida: no bloquear mientras se espera. La diferencia es que Rust usa todos los núcleos del procesador, gasta menos memoria y comprueba al compilar que dos tareas no pisan el mismo dato. Para un servicio que mueve muchos datos o debe estar siempre en pie, eso pesa; para una integración sencilla, Node.js suele bastar.

¿Qué pasa si un aparato deja de responder?

Lo que se haya decidido, y se decide antes: esperar un tiempo máximo, reintentar unas cuantas veces con pausas crecientes, marcarlo como caído y avisar. Lo que no puede pasar es que el servicio entero se quede esperando.

¿Sirve para cálculo pesado?

No es su papel. Tokio brilla cuando hay muchas esperas; el cálculo intensivo se manda a hilos aparte para no frenar al resto. Parte del diseño consiste en separar bien las dos cosas.

¿Cómo se sabe qué está haciendo un servicio así?

Con métricas y trazas desde el primer día: cuántas tareas hay en curso, cuánto esperan, cuáles fallan. Sin eso, un servicio concurrente es una caja negra, así que forma parte de la entrega.

Actualizado:

Otras tecnologías

Con qué se combina

Todas las tecnologías
  • Desarrollo en RustAplicaciones, servicios y módulos que no pueden fallar ni ir lentos. Programamos en Rust el núcleo de tu producto o la pieza que hoy lo frena.
  • APIs y backends en Rust con AxumServicios web en Rust que responden rápido y consumen poco. Cada petición se comprueba por su forma antes de llegar a tu lógica.
  • Apps de escritorio con TauriAplicaciones para Windows, macOS y Linux con interfaz web y núcleo en Rust: instaladores ligeros y permisos acotados. Nuevas o migradas desde Electron.

Empezar

Cuéntanos qué tiene que atender tu servicio a la vez.

Con saber cuántos aparatos o conexiones hay y qué falla hoy nos basta para una primera respuesta.

Qué ayuda a valorarlo

  • Qué aparatos, clientes o sistemas se conectan
  • Cuántos a la vez y con qué frecuencia
  • Qué pasa hoy cuando uno falla
  • Dónde se ejecuta: un equipo, un servidor, la nube

¿Antes de escribir? Mira cómo presupuestamos un proyecto o las soluciones por área de la empresa.

Fig. 07Manipulador MorseH · O · L · A