Microservizio dipendente da un altro, gestendo con garbo il fallimento di uno di loro [duplicato]

0

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?

    
posta Steve Chamaillard 06.02.2018 - 20:49
fonte

1 risposta

2

Se non vuoi mai avere un cliente senza un telefono o un telefono senza un cliente, dovrebbero trovarsi nello stesso repository.

Puoi quindi utilizzare le transazioni normalmente per ripristinare i fallimenti

    
risposta data 08.02.2018 - 17:30
fonte

Leggi altre domande sui tag