Come utilizzare in modo efficace i servizi Web in un ambiente aziendale se non è possibile utilizzare le transazioni?

14

Il posto in cui lavoro sta cercando di stabilire alcune regole di base, e il dibattito che stiamo avendo ora è quello delle librerie locali e dei servizi web per il riutilizzo del codice. I servizi Web sembrano essere la scelta più popolare nella maggior parte delle aziende, e questo è ciò a cui la maggior parte degli sviluppatori si sta impegnando.

Non riesco a vedere come puoi utilizzare in modo efficace i servizi Web per qualsiasi lavoro serio. Come posso eseguire in sicurezza più chiamate di assistenza se non riesco a utilizzare una transazione?

Diciamo che ho un cron job che attira i clienti dal nostro database che soddisfano una determinata condizione di cui devono essere informati. Vengono inviati un fax, un'e-mail e viene creato un ticket per tenere traccia del problema internamente. Sono 3 chiamate di servizio diverse che accadono per ogni cliente in un ciclo for.

Se si verifica un errore ovunque, è possibile che, ad esempio, un fax e una e-mail vengano inviati al cliente, ma non viene creato un ticket. O peggio ancora, questo lavoro cron potrebbe contenere un bug che lo fa fallire allo stesso punto ogni volta, e invia ripetutamente email allo stesso cliente. Se le librerie fossero tutte locali, tutto potrebbe essere semplicemente racchiuso in una transazione, e nulla di tutto ciò accadrebbe. Ma stiamo usando i servizi web in questo esempio.

Si noti che i metodi e-mail e fax in realtà inseriscono i dati nelle tabelle delle code supportate dal database, che a loro volta sono gestiti da un processo cron separato. Pertanto, le chiamate ai metodi di servizio "invia email" e "invia fax" potrebbero essere annullate senza effetti collaterali se necessario.

Un'opzione consiste nel mettere tutta questa porzione di codice nel servizio web stesso, così il servizio web stesso chiamerebbe i metodi di creazione di email, fax e ticket in una transazione. Ma poi stiamo creando un metodo di servizio web solo per l'uso di una transazione; non c'è una ragione valida per cui avremmo mai bisogno di chiamare questo metodo da nessuna parte eccetto questo script di cron.

Come gestiresti in generale questo metodo?

    
posta ryeguy 14.02.2012 - 14:53
fonte

5 risposte

5

Quello che stai descrivendo è in realtà una transazione distribuita che implementa commit a due fasi . Alcune piattaforme di messaggistica aziendale includono i gestori delle transazioni per supportare questo genere di cose, ma i prodotti concreti dipendono dalla piattaforma e dalla lingua. Non ho esperienza concreta con questi strumenti, ma spero che questi suggerimenti aiutino.

    
risposta data 14.02.2012 - 16:22
fonte
3

È interessante il fatto che partecipando a questo particolare Q & A, c'è una discussione simile sui servizi che supportano più piattaforme sulla mailing list DDD / CQRS a cui sto partecipando. Posso ripetere alcune delle mie consiglio qui.

Un'opzione per il supporto delle transazioni in un ambiente eterogeneo utilizza un meccanismo di trasporto che supporta le transazioni ed è supportato su tutte le piattaforme da cui verrà utilizzato. Il Advanced Message Queue Protocol (AMQP) supporta le transazioni e vi è un'API nativa per quasi tutte le lingue che vengono comunemente utilizzate oggi. RabbitMQ è un server che implementa AMQP ed è stato valutato nel settore come una soluzione solida.

Sfruttare un sistema basato su RabbitMQ ti mette sulla strada per avere un ESB completo nel caso avessi bisogno di crescere in esso. Pubblichi messaggi su un canale e ti iscrivi a una coda. Dove ciò diventa veramente potente è quello tra il canale e la coda, è possibile eseguire un sacco di cose interessanti. Un canale può alimentare più code (pub / sub) una coda può essere alimentata da più canali, puoi instradare i messaggi a code diverse in base al contenuto, ecc. Ecc.

Stavo solo leggendo le alternative alle transazioni (che vengono con sovraccarico e trasformano un'operazione asincrona in un blocco). RabbitMQ supporta la cosiddetta conferma dell'editore . Fondamentalmente ti permette di registrare un callback per un metodo pubblicato per gestire una transazione fallita. Nel tuo caso potrebbe annullare le richieste email / fax ed eliminare il ticket.

Ovviamente la tana del coniglio (scusate il gioco di parole) va ancora più in profondità da lì. Puoi usare Coniglio per fare orchestrazioni complesse con servizi web interni ed esterni.

Per i tuoi servizi web pubblici, diventa semplicemente semplice. Il tuo servizio (sia esso SOAP, REST o JSON) pubblica un messaggio nella coda di servizio appropriata e lascia che il tuo sistema interno lo gestisca da lì.

Esistono anche funzionalità per la creazione di un messaggio di richiesta / risposta per quegli scenari in cui ci si aspetta che le informazioni tornino rapidamente.

    
risposta data 14.02.2012 - 19:08
fonte
2

Le parole chiave che stai cercando sono "coreografia del servizio web".

Controlla l'articolo Wikipedia a riguardo.

    
risposta data 14.02.2012 - 18:50
fonte
1

Il modo in cui l'ho gestito in un'app di servizi che ho scritto è stato creare un wrapper per gestire le transazioni necessarie. Nel mio caso, la richiesta dell'utente, effettuata da sito Web, app desktop o servizio Windows, ha dovuto interrogare un servizio Web e, in base al risultato e alle opzioni dell'utente, ha dovuto aggiornare un DB locale e, facoltativamente, uno remoto tramite un servizio web. Quindi è stato necessario generare un report da restituire immediatamente, via e-mail e / o fax. Avevo il controllo sul DB locale, sulla generazione di e-mail e di report ma nessuno sui servizi Web o sul server fax.

La creazione di un wrapper ha consentito un migliore controllo delle transazioni e gestione degli errori. Inoltre, ha consentito una maggiore sicurezza controllando l'accesso ai servizi di rete interni da fonti esterne. In generale, vedo la necessità di transazioni e gestione del servizio come un valido motivo per creare un wrapper appropriato per una singola soluzione, purché il codice venga riutilizzato correttamente (nessuna codifica cut-n-paste).

    
risposta data 14.02.2012 - 16:13
fonte
1

I just can't see how you can effectively use web services for any serious work. How can I safely execute multiple service calls if I can't use a transaction?

Non puoi.

La domanda che dovresti porre è: come posso implementare le transazioni con il framework dei servizi web X? In questo momento, stai solo supponendo che sia impossibile.

    
risposta data 14.02.2012 - 19:19
fonte

Leggi altre domande sui tag