Se ha denunciado esta presentación.
Se está descargando tu SlideShare. ×

Manejando las redes como un señor

Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Cargando en…3
×

Eche un vistazo a continuación

1 de 79 Anuncio
Anuncio

Más Contenido Relacionado

Más reciente (20)

Anuncio

Manejando las redes como un señor

  1. 1. Manejando las redes como un señor
  2. 2. Jose Manuel Montero CrossPlatform Developer Jmmontero.ortega@gmail.com @josemmortega
  3. 3. Sponsors Sin ellos no sería posible el evento!
  4. 4. - Gestión de la conectividad
  5. 5. - Gestión de la conectividad - Buena cache
  6. 6. - Gestión de la conectividad - Buena cache - Arquitectura que opere offline
  7. 7. Gestión de la Conectividad
  8. 8. 👌
  9. 9. 🖕
  10. 10. Timeout
  11. 11. Cache
  12. 12. Arquitectura offline
  13. 13. ViewModel
  14. 14. ViewModel Solo para lógica de la vista
  15. 15. ViewModel WebService API Solo para lógica de la vista
  16. 16. ViewModel WebService API Solo para lógica de la vista El resto de la aplicación debe Desconocer si estamos o no conectados
  17. 17. ViewModel WebService API Services Solo para lógica de la vista El resto de la aplicación debe Desconocer si estamos o no conectados
  18. 18. ViewModel WebService API Services Solo para lógica de la vista El resto de la aplicación debe Desconocer si estamos o no conectados Solo los que deben y necesitan Conocer el estado de la conectividad
  19. 19. WebService API ViewModel
  20. 20. WebService API ViewModel
  21. 21. WebService API ViewModel
  22. 22. WebService API ViewModel
  23. 23. WebService API ViewModel - Response - (Related with endpoint) - Offline Sync Action
  24. 24. Offline Sync Action - FIFO - Con Peros
  25. 25. Offline Sync Action - FIFO - Con Peros - Si tengo operaciones relacionadas agregadas como hijos
  26. 26. Offline Sync Action - FIFO - Con Peros - Si tengo operaciones relacionadas agregadas como hijos - Sistema de reglas
  27. 27. Offline Sync Action - FIFO - Con Peros - Si tengo operaciones relacionadas agregadas como hijos - Sistema de reglas - No volver a informar al resto de la aplicación hasta que el proceso De sincronización termine
  28. 28. Conclusiones
  29. 29. Conclusiones - No hay una solución estandar adatable
  30. 30. Conclusiones - No hay una solución estandar adatable - Intenta que todo tu proceso offline no se extienda por el código
  31. 31. Conclusiones - No hay una solución estandar adatable - Intenta que todo tu proceso offline no se extienda por el código - En tu arranque de la app ten al menos una base para gestionar la conectividad
  32. 32. Conclusiones - No hay una solución estandar adatable - Intenta que todo tu proceso offline no se extienda por el código - En tu arranque de la app ten al menos una base para gestionar la conectividad - Para third parties. Usa abstracciones
  33. 33. Conclusiones - No hay una solución estandar adatable - Intenta que todo tu proceso offline no se extienda por el código - En tu arranque de la app ten al menos una base para gestionar la conectividad - Para third parties. Usa abstracciones - Los eventos de dominio son geniales para gestionar los interesados de conocer la conectividad
  34. 34. Less talk, more code
  35. 35. No me queda código, ninio. Solo masibón
  36. 36. Jmmontero.ortega@gmail.com @josemmortega
  37. 37. El software es como la entropía. Es difícil de entender, no pesa nada y obedece a la segunda ley de la termodinámica; es decir, siempre aumenta Norman Ralph Augustine
  38. 38. ¡Gracias!

Notas del editor

  • Javi me decía, vamos a poner tu charla en el track 1. Y yo le respondía que no, porque es una charla para los más cafeteros. Así que aviso.
  • La razón porque estoy haciendo está charla, es porque en el último año
  • Estoy desarrollando una aplicación móvil especializada en sistemas MES (Manufacturing execution system)
  • Fliparíais como parte de esas plantas llegan a ser pseudo jaulas de Faraday, para proteger la producción lo máximo posible.
  • Cuando tenemos conexión al servidor esto es estupendo
  • Pero va a ser más común tener este escenario.
  • ¿Qué podemos hacer para gestionar este escenario correctamente?
  • Debemos tener una correcta gestión de la conectividad y que está sea lo más transparente posible para el usuario
  • Para que sea transparente para el usuario, debemos tener una cache fuerte y que nos permita almacenar todos estos datos
  • Debemos saber como tener una lógica para la gestión del offline dentro de nuestra aplicación. Ahora veremos estos tres puntos con detenimiento
  • ¿Primero me gustaría preguntaros como gestionais la conectividad en vuestras aplicaciones?
  • Muchos de vosotros pensareis tengo Xamarin Essentials, con eso tengo suficiente.
  • Así es como gestiona la conectividad Xamarin Essentials en iOS y es muy similar en otras plataformas. Te digo que el usuiario está conectado, si este tiene una red activa ya sea Wifi o Internet
  • Pero esto no nos vale para nuestro escenario previo. Que ocurre si tengo conexión de internet, pero el servidor es local o no es accesible desde 4G
  • Además ocurre otra situación. Existen redes publicas que si no estás conectado a la misma, tu API te va a decir que tiene conectividad, pero cuando haces peticiones si el usuario no ha hecho login sobre este tipo de redes wifi, la respuesta que vas a recibir
    A tus llamadas de API es el HTML de login de estas páginas.
  • Para añadir una mayor seguridad de conocer si hay o no conexión lo mejor es realizar una petición de PING, una petición de conectividad básica
  • Pero esto generaba un nuevo problema, antes de poder hacer una petición al servidor, se debía verificar si el servidor respondía con su correspondiente Timeout mínimo esperado, con lo que la respuesta se ralentizaba
  • Como podíamos evitar que el usuario no tuviese que esperar
  • Hemos creado un servicio que trabaja por detrás que realiza por nosotros este. Ping para tener la respuesta en el momento, además que hemos conseguido que el sistema sea más reactivo, porque no esperamos que el usuario haga una peticióin al servidor para verificar si tiene o no tiene conexión.
  • El usuario está conectado al wifi, la aplicación ya sabe si debe responder online u offline a la respuesta y llegar al servidor local
  • Entonces todo funciona perfectamente.
  • Pues no…
  • Estamos obteniendo datos en los cuales comprobamos que los usuarios están conectados con el sistema casi todo el tiempo, en ocasiones todo el tiempo, pero seguimos recibiendo peticiones con respuesta de Timeout
  • Que pensamos que está ocurriiendo. El usuario en la planta se encuentra conectado a un punto wifi y realiza una petición.
  • Este durante el tiempo que llega o no llega la petición y espera la respuesta por parte del servidor, se conecta a otro punto de acceso y por lo tanto se pierde la primera petición.
  • Estamos desarrollando ahora mismo obtener información de los puntos de acceso que tiene los usuarios cerca, para ser más inteligentes a la hora de decidir de manera más eficiente si podemos o no, lanzar las peticiones online u offline.
  • ¿Que es mejor para gestionar nuestra cache? SQLite? Akavache? Un Json?
  • ¿Que es mejor para gestionar nuestra cache? SQLite? Akavache? Un Json?
  • ¿Que es mejor para gestionar nuestra cache? SQLite? Akavache? Un Json?
  • ¿Que es mejor para gestionar nuestra cache? SQLite? Akavache? Un Json?
  • ¿Que es mejor para gestionar nuestra cache? SQLite? Akavache? Un Json?
  • ¿Que es mejor para gestionar nuestra cache? SQLite? Akavache? Un Json?
  • ¿Que es mejor para gestionar nuestra cache? SQLite? Akavache? Un Json?
  • Para obterner la respuesta, podeis revisitar una charla que di, hace unos años también en la Monkey donde se analiza detenidamente cada uno de los métodos como almacenar nuestros datos localmente. Aunque tiene un par de años, todos los métodos
    Siguen siendo funcionales y estables.
  • Como bien sabemos todos, los programadores tenemos dos problemas principales: Nombrar las cosas y cuando invalidar la cache. ¿Entonces como resolver el segundo problema inteligentemente?
  • Crea una capa de abstracción sobre tu cache, para tener diferentes caducidades sobre diferentes entidades
  • Crea estrategias en tu backend de obtener lo último actualizado
  • Crea procesos que te permitan comodamente cargar información en tu cache al arranque y puedas estrategicamente saber que cargar.
  • Volvamos a recordar nuestro escenario de conectividad. El usuario está conectado al wifi, la aplicación ya sabe si debe responder online u offline a la respuesta y llegar al servidor local
  • Como y de que uso deben tener todas nuestras partes de la aplicación que sepan o no sepan si el sistema es offline.
  • Los viewmodels deben conocer si es offline o no. Pero lo más razonable es que este conocimiento solo fuese necesario para la lógica de la vista o para gestionar puntos concretos de ese ViewModel. Nunca deben ser los responsables de dar conocimiento a otros fragmentos de nuestra aplicación.
  • Todo nuestro servicio web, debe saber como operar con la petición, pero el retorno debe ser idéntico y toda la gestión debe quedarse dentro de nuestra API para el webservice.
  • Los servicios interesados de nuestra aplicación que quieran conocer si hay o no hay conexión, deberían saberlo.
  • Para resolver el problema de conectividad tanto para ViewModels, como para los servicios se debe crear una interfaz, que implemente los puntos mínimos de ejecución online u offline y el estado en el quue se encueuntra.
  • Denrtro del servicio de conectividad, informaremos a todos los interesados (todos los que hayan implementado la interfaz) haciendolo responsables. Vamos, un evento de dominio.
  • Volvamos a nuestra api de web service. Cualquier parte de nuestro código llama a esta API
  • Esta inspecciona si tenemos o no conexión.
  • Si estamos online, resolvemos con el servidor y ya estaría.
  • Si no, respondemos contra nuestra cache dentro de todo lo que sea posible.
  • Además debemos tener dos acciones una: responder contra la cache, siempre teniendo como referencia nuestro endpoint. Otra ejecutar un proceso offline de sincronización.
  • Como se sincroniza posteriormente.
    Usando el método FIFO pero con ciertos Peros
  • Si existen operaciones relacionadas entre ellas que se ejecuten en un bloque. Por ejemplo si pido crear una entidad que está se ejecuta offline y luego se opera con la misma entidad, todas esas operaciones irán linkadas a la tarea de sincronización de la primera tarea.
  • Antes de ejecutar las tareas de siincronización tenemos un sistema de reglas que nos permita mover el orden de las tareas o poder verificar si hay tareas que pueda generar conflictos a la hora de sincronizarse.
  • Antes de ejecutar las tareas de siincronización tenemos un sistema de reglas que nos permita mover el orden de las tareas o poder verificar si hay tareas que pueda generar conflictos a la hora de sincronizarse.
  • He dedicido no hacer ejemplos de código hablando de esto, porque al final es un trabajo extra que al final cae en saco roto, en la mayoría de los casos. Si necesitais ayuda al respecto no dudeis en contactar conmigo para que pueda echaros un cable, que no muerdo.

×