¿Dónde y cuáles son los recursos?
REST se trata de abordar los recursos de una manera apátrida y reconocible. No tiene que implementarse a través de HTTP, ni debe depender de JSON o XML, aunque se recomienda encarecidamente que se utilice un formato de datos hipermedia (consulte el principio HATEOAS ) ya que los enlaces y los identificadores son deseables.
Entonces, la pregunta es: ¿cómo se piensa acerca de la sincronización en términos de recursos?
¿Qué es la sincronización bidireccional? **
La sincronización bidireccional es el proceso de actualizar los recursos presentes en un gráfico de nodos para que, al final del proceso, todos los nodos hayan actualizado sus recursos de acuerdo con las reglas que rigen esos recursos. Normalmente, se entiende que todos los nodos tendrían la última versión de los recursos tal como está presente en el gráfico. En el caso más simple, el gráfico consta de dos nodos: local y remoto. Local inicia la sincronización.
Por lo tanto, el recurso clave que debe abordarse es un registro de transacciones y, por lo tanto, un proceso de sincronización podría verse así para la colección de "elementos" en HTTP:
Paso 1: Local recupera el registro de transacciones
Local: GET /remotehost/items/transactions?earliest=2000-01-01T12:34:56.789Z
Remoto: 200 OK con el cuerpo que contiene el registro de transacciones que contiene campos similares a este.
itemId
- un UUID para proporcionar una clave primaria compartida
updatedAt
- marca de tiempo para proporcionar un punto coordinado cuando los datos se actualizaron por última vez (suponiendo que no se requiere un historial de revisión)
fingerprint
- un hash SHA1 del contenido de los datos para una comparación rápida si faltan updateAt
unos segundos
itemURI
- un URI completo para el elemento para permitir la recuperación posterior
Paso 2: Local compara el registro de transacciones remotas con el suyo
Esta es la aplicación de las reglas comerciales de cómo sincronizar. Por lo general, itemId
identificará el recurso local y luego comparará la huella digital. Si hay una diferencia, se hace una comparación de updatedAt
. Si estos están demasiado cerca de la llamada, entonces se deberá tomar una decisión para extraer en función del otro nodo (tal vez sea más importante), o para empujar al otro nodo (este nodo es más importante). Si el recurso remoto no está presente localmente, se realiza una entrada de inserción (esta contiene los datos reales para insertar / actualizar). Se supone que los recursos locales que no están presentes en el registro de transacciones remotas no se modifican.
Las solicitudes de extracción se realizan en el nodo remoto para que los datos existan localmente utilizando itemURI
. No se aplican localmente hasta más tarde.
Paso 3: empuje el registro de transacciones de sincronización local al control remoto
Local: PUT /remotehost/items/transactions
con cuerpo que contiene el registro de transacciones de sincronización local.
El nodo remoto podría procesar esto sincrónicamente (si es pequeño y rápido) o asincrónicamente (piense 202 ACEPTADO ) si es probable que incurra en una sobrecarga. Asumiendo una operación sincrónica, el resultado será 200 OK o 409 CONFLICT dependiendo del éxito o el fracaso. En el caso de un CONFLICTO 409 , entonces el proceso debe iniciarse nuevamente ya que ha habido un fallo de bloqueo optimista en el nodo remoto (alguien cambió los datos durante la sincronización). Las actualizaciones remotas se procesan bajo su propia transacción de aplicación.
Paso 4 - Actualiza localmente
Los datos extraídos en el Paso 2 se aplican localmente en una transacción de aplicación.
Si bien lo anterior no es perfecto (hay varias situaciones en las que lo local y lo remoto pueden tener problemas y tener datos remotos de extracción local es probablemente más eficiente que meterlo en un gran PUT), demuestra cómo REST puede usarse durante un bi- proceso de sincronización direccional.