Generalidades

Messenger Library of Gojek Information Highway | por Deepanshu | Productos Gojek + Tecnología | Octubre de 2021

En la Parte 1 y la Parte 2 de la serie Courier, hablamos sobre los principios básicos detrás de la construcción de Courier y la búsqueda del agente de mensajes de Courier. Esta es una revisión rápida:

  • Decidimos reemplazar el sondeo HTTP con una conexión persistente de larga duración para enviar actualizaciones de pedidos a nuestros comerciantes.

Lea más información aquí:

Courier es nuestra solución interna que utiliza MQTT para proporcionar una autopista de mensajería en tiempo real, liviana y eficiente entre las aplicaciones móviles y los servidores.

Cuando comenzamos a diseñar la biblioteca Courier para nuestra aplicación comercial, teníamos algunas preguntas:

  • ¿Qué biblioteca deberíamos usar para implementar el cliente MQTT? ¿O deberíamos crear nuestra propia biblioteca?

Déjame responder cada pregunta por separado.

¿Deberíamos crear nuestra propia biblioteca o usar una biblioteca existente?

De hecho, hicimos una combinación de los dos. Usamos la biblioteca existente para implementar el protocolo MQTT y creamos nuestra propia biblioteca sobre esta base.

La biblioteca que usamos para la implementación de MQTT es Paho. Es una biblioteca de código abierto muy popular, escrita en Java y por eclipse.

Según el documento, el cliente Paho Java es una biblioteca cliente MQTT escrita en Java para desarrollar aplicaciones que se ejecutan en JVM u otras plataformas compatibles con Java (como Android).

Ahora, aquí viene la pregunta: ¿cuál es la razón para crear una nueva biblioteca sobre Paho? Por tanto, hay muchas razones para ello.

Paho es una implementación de protocolo MQTT simple que proporciona dos tipos de API: bloqueo y no bloqueo. Maneja toda la lógica específica del protocolo, como la creación de conexiones MQTT, la suscripción / cancelación de suscripción a temas, la publicación y recepción de mensajes y la desconexión de conexiones existentes. Pero no es una biblioteca madura necesaria para mantener conexiones persistentes de larga duración.

Ahora veamos las funciones proporcionadas por la biblioteca de Android Courier.

API limpia

La biblioteca Courier proporciona una interfaz inspirada en la transformación. enviar, recibir, suscripción con Darse de baja funcionar.

por conectar con desconectar API, la biblioteca Courier proporciona una interfaz separada-MqttClient.

Compatibilidad con adaptador de mensajes y adaptador de transmisión

semejanza Modernización, La biblioteca Courier brinda soporte para agregar mensajes personalizados y adaptadores de flujo.
De forma predeterminada, la biblioteca brinda soporte Gerson, Mohi Y Búfer original Adaptador de mensajes y RxJava2 Y Coroutine (proceso) Adaptador de corriente.

Reconexión automática

Esta es una de las funciones más importantes de la biblioteca Courier. Siempre que la conexión MQTT se desconecte debido a una operación no iniciada por el usuario, como la pérdida de la red o el tiempo de espera de lectura del socket, la biblioteca intentará reconectarse automáticamente. La lógica de reintento exacta está determinada por la estrategia de reintento, de la que hablaremos pronto.

Tienda de suscripción y resuscripción automática

La tienda de suscripción realiza un seguimiento de los temas suscritos y las cancelaciones pendientes.

Cuando el cliente se vuelve a conectar, el tema suscrito se utiliza para volver a suscribirse automáticamente Conexión no persistente (cleanession = true).

Mantenga los temas pendientes de cancelación de suscripción para evitar suscripciones desactualizadas en el corredor de MQTT Conexión persistente (cleanession = false).

Estrategia de reintento y retroceso

La biblioteca Courier proporciona diferentes tipos de estrategias: Estrategia de reintento de conexión, estrategia de suscripción, estrategia de reserva de hostEstas estrategias determinan las acciones que se deben realizar en caso de falla y la demora en reintentar.

Estrategia de reintento de conexión Decida si volver a intentar la conexión cuando la conexión falle y la próxima vez que lo intente.

Estrategia de reintento de suscripción Decida si volver a intentar la suscripción cuando falle la solicitud de suscripción y el momento del próximo reintento.

Estrategia de reserva de host Cuando hay varios hosts disponibles y falla la conexión en uno de los hosts, se decide volver a intentarlo con el siguiente host.

Transmisor de alarma

Paho proporciona compatibilidad con PingSender, que se puede utilizar para enviar Solicitud de ping Conéctese a través de MQTT para mantener la conexión activa durante el mayor tiempo posible.

La biblioteca Courier usa dos implementaciones de PingSender: Transmisor de alarma con Temporizador PingSender.

Uso exprés de la biblioteca Transmisor de alarma Implementación de apoyo ELAPSED_REALTIME_WAKEUP, RTC_WAKEUP, ELAPSED_REALTIME, con Reloj en tiempo real Alerta para programar ping.
Uso de la biblioteca RTC_WAKEUP, También es adecuado para el modo dormido y otros modos de ahorro de energía (con algunas restricciones). Esto ayuda a mantener la conexión activa cuando la aplicación está en segundo plano. Esto también se discutirá en detalle más adelante.

Transmisor de tiempo Se utiliza cuando la conexión no necesita estar activa en segundo plano.Usa Temporizador Se utiliza para programar ping.

Mantener vivo adaptativo

Keepalive adaptable es una función de la biblioteca de Courier que intenta encontrar el mejor intervalo de keepalive para los clientes en una red específica. Esto ayuda a optimizar el número de solicitudes de ping enviadas a través de la red y mantener la conexión válida. Esto se discutirá con más detalle en un blog separado.

Tratamiento de contrapresión

La biblioteca Courier utiliza la persistencia interna para manejar la contrapresión, primero almacena todos los mensajes recibidos y luego los pasa al cliente de la biblioteca.

La contrapresión se refiere a la situación en la que los productores producen más rápido de lo que consumen los consumidores.

Persistencia de la base de datos

Paho brinda soporte para la persistencia, pero solo brinda persistencia basada en archivos, lo cual no es muy efectivo para dispositivos móviles. La biblioteca Courier proporciona la implementación de la base de datos SQLite de la interfaz MqttClientPersistence proporcionada por Paho.

Proveedor de eventos

La biblioteca Courier proporciona muchos eventos fuera de la biblioteca, que se pueden usar para múltiples propósitos, como tomar medidas cuando ocurre un evento específico o simplemente agregar análisis para rastrear las métricas del sistema.
Por ejemplo, la biblioteca proporciona eventos de conexión, eventos de suscripción, eventos de ping, eventos de envío y recepción de mensajes, etc.

Mandril MQTT

MQTT Chuck es similar a HTTP Chuck y se usa para verificar llamadas HTTP en aplicaciones de Android. El mandril MQTT comprueba todos los paquetes de datos entrantes o salientes de la conexión MQTT subyacente.

Al igual que HTTP Chuck, utiliza interceptores para interceptar todos los paquetes, conservarlos y proporcionar una interfaz de usuario para acceder a todos los paquetes MQTT enviados o recibidos. También proporciona una variedad de otras funciones, como buscar, compartir y borrar datos.

verificar

El cliente debe estar autenticado antes de establecer una conexión MQTT, de modo que solo los usuarios autenticados puedan acceder al intermediario MQTT. El protocolo MQTT utiliza una combinación de nombre de usuario y contraseña para la autenticación.

La biblioteca Courier proporciona un mecanismo para obtener detalles de autenticación (como el token JWT y la dirección proxy) llamando a la API, que se utiliza además para la autenticación MQTT.

Estas son todas las características de nuestra biblioteca Courier. Analicemos ahora los desafíos específicos de la plataforma a los que nos enfrentamos.

El sistema operativo Android se ha vuelto muy conservador sobre el uso de la batería de la aplicación, especialmente cuando la aplicación está en segundo plano. Si la aplicación se ejecuta en segundo plano durante mucho tiempo sin componentes visibles para el usuario, es probable que el sistema operativo también la elimine.

Además, hay varios modos de ahorro de energía en Android, como Modo de sueño, Modo dormido, con Aplicación en espera modelo. El dispositivo ingresa a estos modos cuando no se está cargando y el dispositivo / aplicación no se ha utilizado durante mucho tiempo.

Las conexiones de larga duración deben seguir ejecutándose en primer plano y en segundo plano. Por lo tanto, es importante considerar la situación anterior al implementar.

La biblioteca Courier maneja esto usando Transmisor de alarma Que horario RTC_WAKEUP Alarma mediante AlarmManager setExactAndAllowWhileIdle() API utilizada para enviar solicitudes de ping para mantener viva la conexión.

Debido a la limitación del modo dormido, setAndAllowWhileIdle() ni setExactAndAllowWhileIdle() Cada aplicación puede activar una alarma varias veces cada 9 minutos. Por lo tanto, presentamos Adaptive Keepalive, que minimiza la cantidad de alarmas programadas al encontrar el mejor tiempo de Keepalive en una red específica.

Planeamos extender Courier para múltiples casos de uso, como chat y seguimiento de eventos en tiempo real. Esto también nos ayudará a lograr nuestro objetivo a largo plazo de establecer una conexión de larga duración en la aplicación Gojek.

También planeamos abrir la biblioteca Courier para Android en el futuro. Consulte el proyecto de código abierto de Gojek aquí.

¡Manténganse al tanto! En el próximo blog, hablaremos de la biblioteca Courier de iOS.

Encuentre más historias de nuestra bóveda, aquí.
Además, ¡estamos contratando! Haga clic a continuación para ver las posiciones abiertas:

LEER  ¿Cuánto cuesta contratar a un buen programador en Silicon Valley, EE. UU.? | Autor: Alyssa Jerrald | Noviembre de 2021

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba