Cómo sincronizar grandes listas entre cliente y servidor

Me gustaría sincronizar una gran lista de elementos entre el cliente y el servidor. Como la lista es bastante grande, no puedo sincronizarla en una sola solicitud, ¿cómo puedo asegurar que la lista se sincronice con una cantidad razonable de llamadas al servicio de sincronización?

Por ejemplo:

Y quiero sincronizar una lista con 100.000 artículos así que hago un servicio web con la siguiente firma

getItems(int offset,int quantity): Item[] 

El problema viene cuando, entre la llamada y la llamada, la lista se modifica. Por ejemplo:

  getItems(0,100) : Return items (in the original list) [0,100) getItems(100,100): Return items (in the original list) [100,200) ##### before the next call the items 0-100 are removed #### getItems(200,100): Return items (in the original list) [300,400) 

Por lo tanto, los elementos [200.300] nunca se recuperan. (Los elementos duplicados también se pueden recuperar si se agregan elementos en lugar de quitarlos.

¿Cómo puedo asegurar una sincronización correcta de esta lista?

  1. De vez en cuando, el servicio debe guardar instantáneas inmutables. La interfaz debe ser getItems(long snapshotNumber, int offset,int quantity)

  2. Para ahorrar tiempo, espacio y tráfico, no todas las modificaciones de la lista deben formar una instantánea, pero cada modificación debe formar un mensaje de registro (por ejemplo, agregar elementos, quitar el rango de elementos) y que los mensajes de registro se debe enviar al cliente en su lugar De instantáneas completas. La interfaz puede ser getModification(long snapshotNumber, int modificationNumber):Modification .

¿Se puede hacer la lista ordenada en algún parámetro en el lado del servidor? Por ejemplo, un caso de uso del mundo real para este escenario es mostrar registros en una tabla en la interfaz de usuario. El número de registros en el lado del servidor puede ser enorme, por lo que no desea obtener toda la lista a la vez y en su lugar se obtiene en cada desplazamiento que el usuario hace.

En este caso, si se ordena la lista, se obtiene un montón de cosas de forma gratuita. Y su API se convierte en getItems(long lastRecordId,int quantity) . Aquí lastRecordId sería una clave única que identifica ese registro en particular. Utilice esta clave para calcular el desplazamiento (en el lado del servidor) y recuperar el lote siguiente de esta ubicación de desplazamiento y devolver el recordId del último registro al cliente que utiliza en su próxima llamada a la API.

No tiene que mantener las instantáneas y no se recuperarán los registros duplicados. Los escenarios que usted menciona en caso de remociones / inserciones no ocurren en este caso. Pero en algún momento, tendrías que descartar la copia que tiene el cliente e iniciar la sincronización de nuevo si quieres realizar un seguimiento de adiciones y eliminaciones en el lado del cliente para los datos que el cliente ya ha visto.

  • Android: ksoap, "UnknownHostException: host no resuelto" dependiendo de la API
  • Cómo saber cuándo finaliza una llamada de Retrofit
  • Respuesta de retorno de loopj asynchttpclient de Android
  • No se pueden llamar métodos de servicio web desde el emulador de proyectos android
  • Envío de imágenes de la galería al servicio web mediante SOAP
  • Cómo utilizar el tipo de llamada con EventBus
  • Android loopj + GCMIntentService enviar mensaje a un Handler en un hilo muerto
  • No se puede deserializar la instancia del objeto de START_ARRAY token en Spring Webservice
  • Crear webservice en drupal
  • Java.net.UnknownHostException: No se puede resolver el host "<url>": ninguna dirección asociada con hostname y End of input en el carácter 0 de
  • Envío de XML a un servicio web en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.