Sincronizzazione bidirezionale di 2 API diverse

4

Attualmente mi è stato assegnato un compito, in cui devo programmare una sincronizzazione bidirezionale tra due software relativi a ERP, uno che fornisce servizi web (Visual Web Reference di riferimento) e l'altro che fornisce un'API REST.

Sono riuscito a far corrispondere i campi delle API insieme, quindi ho potuto potenzialmente iniziare a creare oggetti in entrambe le API, utilizzando gli stessi dati. Tuttavia, ho raggiunto il punto della sincronizzazione effettiva ed è più difficile di quanto pensassi.

Nella mia testa, tutto va bene.

Grabbing the data -> determine, what change it is on which side -> sync the data from the source system to the target system

Ma nella codifica attuale, sto riscontrando alcuni problemi seri:

  • Entrambe le API non hanno modo di dirlo, quando i dati sono stati modificati l'ultima volta, rendendo difficile determinare quale tipo di modifica è (ho pensato di avere un elenco della sincronizzazione precedente da confrontare, ma che porta a un altro problema)
  • Esiste una priorità sul sistema con l'API REST, quindi se ci sono 2 modifiche contemporaneamente, la modifica dell'API REST conterebbe
  • In quale ordine dovrebbero essere sincronizzati? Se c'è un focus sull'API REST, allora l'API REST dovrebbe applicare le loro modifiche dopo quella del servizio web, giusto?
  • Il software di sincronizzazione verrebbe eseguito su un server, al momento in un ciclo permanente di acquisizione dei dati, confronto e applicazione delle modifiche. Mi piacerebbe solo sincronizzare i dati modificati, ma non sarebbe possibile, per quanto riguarda il problema, che non c'è modo per me di determinare, quale cambiamento si è verificato (qualcosa è stato creato, qualcosa è stato cambiato, qualcosa è stato cancellato)

Puoi darmi consigli su come realizzarlo, in modo affidabile e rispettoso delle risorse?

L'API del servizio web è molto più lenta dell'API REST, il che significa che c'è un intervallo, in cui niente viene sincronizzato (potrebbe sembrare stupido, ma pensavo di poter risolvere questo problema con un singolo thread). Potrei potenzialmente aver bisogno di multi-threading qui? L'API del servizio web è limitata a 10000 / ora, non so se questo potrebbe avere un problema.

    
posta Jean Luc Nürrenberg 17.08.2016 - 15:43
fonte

2 risposte

3

Benvenuti nel mondo dell'integrazione. La cosa più difficile è la scarsa comprensione della maggior parte dei fornitori di ciò di cui hai bisogno e delle lacune risultanti nelle loro interfacce.

In questo caso sembra che tu abbia un problema davvero intrattabile:

  1. Devi sapere con precisione quando sono state apportate modifiche
  2. Non c'è modo di dire esattamente quando sono state apportate modifiche

Nessun tipo di design nella tua integrazione risolverà questo difetto nell'API. È necessario che i fornitori risolvano questo problema (l'ultimo aggiornamento, tra le altre cose, dovrebbe essere incluso, non c'è alcuna giustificazione per non fornirlo) oppure è necessario un approccio diverso per soddisfare i propri requisiti.

Penso che quello che potresti tentare di fare è su un intervallo, guarda i due sistemi e applica le modifiche sull'uno all'altro. Se entrambi i sistemi sono cambiati nell'intervallo, si preferisce utilizzare l'altro. Questo è possibile ma probabilmente perderai le modifiche apportate al sistema non preferito se il tuo intervallo è abbastanza lungo. Il modo in cui puoi farlo in base a ciò che hai fornito è quello di esaminare tutti i record e confrontarli con una sorta di record che tieni presente per determinare se sono stati modificati. Ad esempio è possibile mantenere una tabella degli ID record e un hash del record. Quando l'hash cambia, sai che c'è stata una modifica dall'ultima volta che hai controllato. Quindi puoi applicare l'aggiornamento. Questo non è efficiente e puoi avere un problema di lettura sporca.

Il problema che stai cercando di risolvere è essenzialmente quello della consistenza finale . Bitcoin, ad esempio, ha un modo piuttosto interessante di affrontarlo. Penso che se leggi come è realizzato, scoprirai che ti mancano gli elementi dati necessari per farlo funzionare.

    
risposta data 17.08.2016 - 15:53
fonte
1

Puoi confrontare i dati di entrambi i siti, ma, tra l'altro, penso che ti imbatterai nel problema della cancellazione che riappare.

Penso che dovrai mantenere istantanee per il confronto di un sistema con se stesso per trovare in seguito ciò che è cambiato all'interno di ciascun sistema da solo, quindi sistemare quelle modifiche con l'altro lato e aggiornare anche l'istantanea di ciascuna.

Usando questo tipo di istantanea, potresti perdere alcuni aggiornamenti intermedi (ad esempio, lo stesso record aggiornato due volte), anche se suppongo che sia probabilmente ok.

Tuttavia, mi assicurerei che le istantanee siano ottenute atomicamente, quindi l'istantanea è completamente corretta per un singolo punto nel tempo.

    
risposta data 17.08.2016 - 17:55
fonte

Leggi altre domande sui tag