Stiamo iniziando a lavorare sui microservizi per ricostruire la nostra applicazione legacy, pezzo per pezzo. Abbiamo iniziato creando un modulo di registro che è responsabile dell'intero processo di registrazione.
Per semplificare, supponiamo che RegisterModule
utilizzi CustomerModule
per mantenere un cliente, quindi un PhoneModule
che ha bisogno di customer_id
per mantenere un telefono nel database.
CustomerModule
sarà simile a pseudocode:
<?php
class CustomerModule
{
public function createCustomer(array $inputs)
{
$this->checkInputs($inputs);
$customer = $this->repository->create($inputs);
$this->phoneModule->createPhone($customer->getId(), $inputs);
return json_encode(['data' => '1']);
}
}
checkInputs
genererebbe un'eccezione gestita dai livelli superiori nel modulo che restituirebbe gli errori alla RegisterModule
con il codice HTTP corretto. Niente di persistente, i dati sono coerenti.
Ora con lo pseudocodice PhoneModule
:
<?php
class PhoneModule
{
public function createPhone(integer $customerId, array $inputs)
{
$this->checkInputs($inputs);
$phone = $this->repository->create($customerId, $inputs);
return json_encode(['data' => '1']);
}
}
Ancora una volta, quando checkInputs
incontra un errore di convalida, per quel microservizio non verrà mantenuto nulla. Ma il problema qui è che CustomerModule
ha già mantenuto un cliente nel suo database. Ma questo cliente non ha un telefono associato che non è quello che vogliamo.
Ho letto molto sulle transazioni distribuite. Il mio CTO non vuole sentir parlare di coerenza finale (e in questo caso sono al 100% dalla sua parte). La maggior parte delle soluzioni che ho visto sembrano molto difficili da implementare e non sono nemmeno sicuro che siano gli strumenti necessari per risolvere questo problema.
Una soluzione potrebbe essere quella di fare tutto il controllo in anticipo, e poi fare le azioni persistenti. Ma questo significherebbe la duplicazione del controllo sia nel percorso persistente che nel controllo, o questo significa che potremmo persistere senza alcun controllo se ci "dimentichiamo" di fare i controlli in anticipo.
Come gestisci questo nel modo più semplice?