Kronos-Android: NTP sencillo

Kevin Jevin Woo
Lyft Engineering en Español

--

Este artículo fue publicado originalmente el 27 de enero de 2020 en eng.lyft.com, por Amelia Riely y fue traducido por Kevin Woo.

Con base en un muestreo de más de 5 millones de sesiones, más del 3% de los usuarios de Android de Lyft tienen un desfase de más de un minuto en los relojes de sus dispositivos. Eso es más del doble del 1% que vemos en iOS.

Piensa en lo que eso representaría para nuestros sistemas y nuestros usuarios si es que dependiéramos de las marcas de tiempo del dispositivo para los analíticos, eventos offline, ubicaciones o tiempos mostrados. La información pierde orden y sentido; los conductores serían enviados a viajes que ya no tienen sentido geográficamente; los usuarios podrían ver tiempos estimados de llegada que parece que están en el pasado.

Introduciendo Kronos

Estamos anunciando Kronos-Android, una biblioteca de código abierto de sincronización de Network Time Protocol (NTP), que provee un reloj de confianza en la JVM. Este post acerca de Kronos para iOS entra en detalle sobre nuestra decisión de obtener un “tiempo sensato” de NTP.

A diferencia del reloj del sistema, el tiempo reportado por Kronos no se ve afectado cuando el tiempo local cambia mientras tu aplicación está corriendo. En su lugar, Kronos guarda un tiempo NTP acertado junto con la diferencia entre el tiempo NTP y el tiempo de ejecución del sistema. Debido a que este tiempo de ejecución crece de forma monótona, Kronos no se ve afectado por los cambios en el reloj del dispositivo. Llamar al método KronosClock.getCurrentTimeMs() regresará el tiempo local con base en el último tiempo verificado más la diferencia entre la última sincronización.

Primeros pasos

Incluye lo siguiente en tu archivo build.gradle:

implementation "com.lyft.kronos:kronos-android:$latest_version"

Obtén una instancia del reloj Kronos que esté sincronizada con servidores NTP.

class YourApplication : Application() {

lateinit var kronosClock: KronosClock

override fun onCreate() {
super.onCreate()

kronosClock = AndroidClockFactory.createKronosClock(applicationContext)
kronosClock.syncInBackground()
}
}

Reemplaza el uso de

System.currentTimeMillis()

Con

kronosClock.getCurrentTimeMs()

Si no se puede conectar con el servidor NTP o Kronos aún no ha sido sincronizado, getCurrentTimeMs() regresará el tiempo del dispositivo o de algún otro reloj de respaldo (fallback clock) y activará syncInBackground(). Si prefieres controlar el escenario de respaldo, puedes usar getCurrentNtpTimeMs(), que regresará null en vez de el tiempo del reloj de respaldo.

Debido a que depende del tiempo de uso del sistema, Kronos detecta y requiere una nueva sincronización tras cada reinicio.

Para tu caso de uso

Kronos viene con un set de configuraciones default que han funcionado bien para nosotros. Puedes personalizar las configuraciones usando AndoridClockFactory.createKronosClock() con un set de parámetros opcionales descritos en el README.

Con o sin Android

Kronos provee acceso a la biblioteca base de Kotlin, Kronos-Java, para su uso con módulos que no sean Android. Kronos-Java depende de un reloj local provisto externamente y un caché. La biblioteca de Android abstrae la creación del reloj al extraer el reloj del sistema de Android de un Context provisto. Abstrae la creación del caché al usar SharedPreferences.

Para usar Kronos-Java, incluye lo siguiente en tu archivo build.gradle:

implementation "com.lyft.kronos:kronos-java:$latest_version"

Bienvenido al tiempo sensato

Revisa la biblioteca en Github.

¡Lyft está contratando! Si estás interesado en trabajar en proyectos como este y moldear el futuro del transporte, aplica para unirte a nuestro equipo.

Por favor comenta con tu cita favorita acerca del tiempo — yo perdí la oportunidad de incluir alguna en este post. Me estuve entreteniendo con varias de estas.

--

--