Come posso mantenere l'integrità dei dati su più servizi in modo simile alla transazione con PHP? [duplicare]

2

Trovo il concetto di transazione davvero utile quando si lavora con i database perché ovviamente consente di eseguire il rollback delle modifiche se un passaggio di una modifica va storto.

C'è un modo per estendere lo stesso principio a più servizi? Supponiamo che io abbia il seguente esempio di qualcuno che carica qualcosa su un sito web (non ideato a proposito, ho a che fare con qualcosa di simile ora):

// Store data in an object store
$object->putToS3();

// Add to ElasticSearch node
Search::indexObject($object);

// Remove local files
$object->deleteLocalFiles();

// Increment some Redis counter
Redis::hmset(...);

// Add to database
$object->save();

C'è qualche soluzione standardizzata su come posso annullare tutte queste azioni se qualcuno fallisce, per mantenere i miei dati nello stato corretto? Non ho molta conoscenza a riguardo.

Ciò che so, tuttavia, è che farebbe schifo per avere qualcosa aggiunto al tuo database che non esiste nella tua soluzione di archiviazione o nel tuo negozio Redis.

Qualcuno ha avuto a che fare con qualcosa di simile?

    
posta ReactingToAngularVues 30.08.2015 - 10:50
fonte

2 risposte

1

La tecnica che stai cercando si chiama commit a due fasi . In sostanza, l'idea è che tu chieda a ciascuno dei tuoi servizi di determinare se la transazione avrà successo o meno, quindi dici separatamente a ciascuno di loro se procedere effettivamente o meno con la transazione. Potrebbero dover bloccare le risorse durante la fase di preparazione per assicurarsi che la transazione sia ancora in grado di completare quando è impegnata.

    
risposta data 31.08.2015 - 08:33
fonte
-3

Penso che non ci sia nulla che tu stia chiedendo.

Vorrei utilizzare un semplice blocco try-catch durante il processo di archiviazione e lanciare qualsiasi eccezione se qualcosa va storto. È necessario tracciare manualmente i risultati di ogni sottooperazione e ripristinare eventuali modifiche avvenute.

    
risposta data 30.08.2015 - 12:02
fonte

Leggi altre domande sui tag