Superando obstáculos: Cómo implementar una estrategia de `Retry` en Dart para mejorar la experiencia de usuario

Carlos Daniel
3 min readMay 30, 2023
Photo by 愚木混株 cdd20 on Unsplash

Versión en inglés.

En el interesante mundo del desarrollo de aplicaciones móviles, nos encontramos con situaciones en las que las cosas no siempre salen según lo planeado. En ocasiones, nos enfrentamos a obstáculos temporales o impredecibles que pueden causar fallas en nuestras operaciones, como por ejemplo problemas de conexión a internet o demoras en el servidor para solamente mencionar un par. A partir de allí, nos preguntamos entonces: ¿Cómo podemos lidiar con estos desafíos y garantizar que nuestras aplicaciones sean sólidas y confiables? Ahí es donde entra en juego la estrategia de “retry”.

¿Qué es una estrategia de `retry` y por qué es importante?

Una estrategia de “retry” es una técnica que nos permite manejar las fallas temporales en las operaciones internas de nuestras aplicaciones, otorgándoles la capacidad de recuperarse automáticamente. En lugar de rendirse y considerar una operación como fallida de inmediato, la estrategia de “retry” nos permite intentarlo nuevamente, cuantas veces sea necesario y después de un período de tiempo determinado. Esta estrategia ofrece una serie de beneficios muy significativos:

1. Robustez y resiliencia

Al implementar una estrategia de retry, nuestra aplicación se vuelve más robusta y capaz de hacer frente a fallos temporales. En lugar de colapsar ante una dificultad momentánea, por ejemplo, mostrar un mensaje de error inmediato, la aplicación intentará nuevamente después de un tiempo, (1 segundo o 200 milisegundos después) lo que aumenta las posibilidades de éxito. Esto nos brinda una mayor confianza en nuestra aplicación y nos permite manejar de manera efectiva fallas transitorias.

2. Mejora de la experiencia del usuario

Imagina la frustración que puede experimentar un usuario cuando una operación falla en el primer intento. Un retry nos permite ofrecer una mejor experiencia al usuario realizando automáticamente nuevos intentos sin requerir su intervención manual. Esto es especialmente valioso en situaciones donde la falla es temporal y es probable que la operación tenga éxito en intentos posteriores. Al evitar frustraciones innecesarias, mejoramos la satisfacción del usuario y fomentamos la confianza en nuestra aplicación.

3. Recuperación automática de errores transitorios

Al reintentar una operación varias veces, tenemos la oportunidad de superar errores temporales que podrían resolverse automáticamente en un intento posterior. Esto evita que los usuarios se vean obligados a tomar acciones adicionales o buscar alternativas, lo que simplifica su flujo de trabajo y mejora la eficiencia. Con la estrategia de retry, podemos automatizar la recuperación de errores transitorios y ofrecer una experiencia más fluida a los usuarios.

4. Manejo de sobrecargas o latencias

En situaciones de alta carga o latencias imprevistas, una estrategia de retry puede ayudarnos a equilibrar la carga y manejar mejor las situaciones temporales en las que nuestros sistemas están sobrecargados. Al reintentar después de un breve intervalo, permitimos que los sistemas se recuperen o que las latencias disminuyan, lo que contribuye a una mayor estabilidad y rendimiento general.

5. Cómo implementarla?

(Disclaimer: esta no es la única vía de implementación, pero es un approach que nos ha funcionado muy bien)

Primero, definimos un type personalizado que llamamos FunctionOnRetry . Este pasa como parámetro a nuestra función de retry que recibe la función que se ejecuta inicialmente doIt, el máximo de reintentos maxRetries hasta que llegue a un success y un delay en milisegundos que indica cada cuánto se repite el doIt . Recurrentemente se realiza el llamada hasta obtener el éxito de la opreción o el flujo de excepción.

Y una forma de usarlo, a continuación:

Nos damos cuenta entonces que su uso es simple, es solamente tener claro qué queremos hacer, y ese fallback en caso de darse, qué queremos también que haga. Configuramos el número de reintentos y listo, cada cuánto se ejecutan.

Para finalizar, la implementación de esta estrategia puede marcar la diferencia en la confiabilidad de nuestras aplicaciones, pues al manejar automáticamente los errores temporales que puedan presentarse y permitir que las operaciones se completen con éxito en intentos posteriores, mejoramos la experiencia del usuario y la resiliencia la app final.

Agradecimientos finales a Daniel Gómez y a Julián Sotelo, también autores intelectuales y materiales de esta implementación.

--

--

Carlos Daniel

Android & Flutter Developer. GDE for Android & Mobile Engineer.