Come affrontare il problema di gestire un servizio esterno che memorizza i dati e si desidera mantenere la sincronizzazione?

3

Sto integrando un'applicazione aziendale con uno schema esistente.

Il problema principale è come sincronizzare i dati tra il mio sistema e un sistema esterno tramite RPC (le chiamate all'API HTTP sono precise).

Cosa ho fatto finora

La prima cosa che ho fatto è dividere l'interfaccia nei metodi di business in modo tale che all'inizio del metodo avessi una chiara idea dei dati su cui vorrei lavorare. Ad esempio, la chiamata al metodo fittizio getIceCreamsOfColor("red") probabilmente effettuerà una chiamata remota per ottenere tutti i gelati rossi.

getIceCreamsOfColor($color) {
  $remoteClient->queryForColor($color)
  ...
}

Questo è generalmente molto meglio di

getIceCreams($idArray) {
  foreach ($idArray as $iceCreamId) {
     $remoteClient->queryForId($iceCreamId)
  ...
  }
}

(a) All'interno di ogni metodo di business a un certo punto dovrei passare 1 secondo circa per scaricare i dati remoti e creare stub locali degli oggetti remoti.

(b) Quindi eseguo la mia logica. Questo significa forse manipolare gli stub locali . Gli stub locali sono in realtà entità aziendali che vengono utilizzati per ragionare sul dominio aziendale e vengono interrogati dal front-end per visualizzare i dati.

(c) Infine dovrei dedicare un altro secondo o più a svuotare il pool di stub locale. Ciò implica la scrittura degli stub sul disco per la memorizzazione nella cache e la scrittura sul server remoto di tutti i dati modificati.

Sia l'azione (a) o (c) sono opzionali se per qualche ragione so che i dati locali sono ancora sincronizzati o non mi interessa molto e voglio solo visualizzare i dati remoti senza modificarli.

A questo punto, controllando il risultato della chiamata remota, il metodo commerciale dovrebbe restituire possibili errori o un messaggio ok.

Questa architettura ti sembra ragionevole?

Pensi che la memorizzazione nella cache locale sia pericolosa / non necessaria per la sincronizzazione dei dati remoti?

Come affronti il problema di gestire un servizio esterno che memorizza i tuoi dati e vuoi mantenerli sincronizzati?

Il motivo principale per cui esiste una sola chiamata per scrivere dati è che l'API remota ha un limite impostato molto basso.

    
posta gurghet 29.04.2016 - 16:37
fonte

2 risposte

2

Sembra ragionevole, salvo due considerazioni.

Accesso client multiplo: cosa succede se il tuo servizio sta gestendo due richieste simultanee per modificare la stessa entità remota? Per lo meno, è necessario assicurarsi che non aggiornino il lato remoto in modo interfogliato, risultando in uno stato remoto che nessuno di loro si aspetta. Dovresti ( ottimisticamente ) bloccare l'accesso a entità remote distinte.

Crash resilience / consistency: cosa succede se il servizio si blocca a metà strada tra l'aggiornamento di una copia locale e l'aggiornamento dell'oggetto remoto? Cosa succede se il lato remoto si arresta in modo anomalo o non è più disponibile per un po 'di tempo?

Fondamentalmente entrambi i problemi riguardano il controllo delle transazioni. Un tipico software che ti dà il controllo delle transazioni è un database (relazionale); possibilmente memorizzando nella cache il tuo stato locale e utilizzandolo per sequenziare l'accesso parallelo e le modifiche di replay / rollback dopo un arresto anomalo o il riavvio potrebbe rendere la tua parte più prevedibile.

    
risposta data 29.04.2016 - 17:29
fonte
1

Preferirei che il server che fornisce i dati abbia effettivamente eseguito il lavoro su di esso per , piuttosto che eseguirlo e lasciarlo manipolare.

Come gestirai più client manipolando allo stesso tempo stesso ? Sto pensando in particolare quando lo scrivi indietro: in che modo il tuo servizio risolverà chi è corretto?

Inoltre, in che modo il servizio convaliderà che hai modificato / modificato i dati in modo valido? Chi determina la validità dei dati persi.

Normalmente mi aspetto che tu usi un'API per chiedere al server di fare qualcosa con quei dati. Di conseguenza, il server può gestire richieste simultanee ed eseguire le azioni per te e persistere di nuovo i dati pur essendo certi che i dati siano manipolati in modo coerente e valido. A mio avviso, se il server sta manipolando e persistendo dati modificati, allora possiede quei dati e non dovrebbe affidare le mutazioni a nessun altro servizio.

    
risposta data 29.04.2016 - 16:55
fonte