Come progettare un'api di sincronizzazione esposta a terze parti che implica una transazione commerciale tra aggregati?

2

Dominio aziendale

Nel dominio Vendite, ho 3 entità: Lead, Contact e Opportunity. Un piombo è iniettato nel sistema da molte fonti e nutrito. Se è una prospettiva, allora viene convertita in contatto e opportunità (potenziale vendita futura). Un contatto rappresenta la persona fisica nel CRM.

Dichiarazione del problema

Un api convertLead che converte un lead di

  1. creazione di un contatto
  2. creare un'opportunità
  3. che segna il lead come convertito

Modello di dominio

Nel mio modello, lead, contatto e opportunità sono aggregati diversi.

Quindi ho bisogno di eseguire una transazione commerciale su 3 aggregati. Il problema è che ho bisogno che la mia API sia sincronizzata - questa è la risposta ricevuta nell'api, poiché questa API sarà esposta a terze parti, quindi non posso rendere questa transazione aziendale alla fine coerente. Tutti i CRM delle vendite forniscono gli apis di sincronizzazione. Come posso fornire una tale api? Sto usando Domain Driven Design per modellare il mio sistema e il framework Lagom per implementarlo.

Soluzioni possibili

  1. Esegui un polling sul lato server per fornire una risposta di sincronizzazione e mantenere il transazione alla fine coerente
  2. Faccio il coordinamento / flusso nel livello di servizio stesso, prendendo a blocco temporaneo sul lead aggregate e svolgimento dell'attività transazione. In caso di malfunzionamento (a causa dell'applicazione, ecc.), Il api non ha potuto completare l'esecuzione e il blocco non sarà più valido come era temporaneo (blocco valido per alcuni secondi). Questo stato transitorio è gestire transazioni parallele (ad esempio deleteLead). All'interno del transazione, se a causa di un errore dell'applicazione l'API non viene completata quindi la transazione rimarrà incompleta. In questo caso d'uso il la transazione incompleta va bene per il business. L'utente avrà appena per inviare nuovamente il comando
  3. In alcuni casi d'uso, come selezionare un lead (cioè assegnare il lead a self), la transazione coinvolge 2 aggregati - lead e userResource aggregato. Ho 2 microservizi, uno responsabile e uno gestione dell'assegnazione delle risorse (come il numero di lead che un utente può lavorare su un territorio, trovare la migliore rappresentante per un ruolo guida, ecc.). Qui Ho bisogno della transazione completa da eseguire o nulla. In questo caso se utilizzo il metodo sopra, alla fine dovrò rendere il sistema coerente anche (a parte la logica del flusso in api) implementando una saga che trova gli aggregati di assegnazione delle risorse nello stato bloccato e li libera.

Le soluzioni 2 e 3 non sembrano molto naturali / consigliate. Anche     c'è un sovraccarico con la modellazione di troppi stati transitori. per favore     consiglia quale modello utilizzare per garantire la coerenza con la sincronizzazione     apis.

    
posta Anisha Agrawal 03.09.2018 - 08:44
fonte

0 risposte