Domanda

Architettura di base: n caselle fisiche ognuna delle quali ospita lo stesso servizio WCF, seduto per creare un bilanciamento del carico. Ogni casella che colpisce una singola infrastruttura di database che non supporta le transazioni - non chiedere :(

Quindi, nel livello di accesso ai dati della mia app ho bisogno di un metodo di transazioni distribuite. Quali sono le mie opzioni?

Tieni presente che i client del mio sistema saranno app legacy che comunicano utilizzando servizi Web di base (BasicHttpBinding) e nuovi client WCF (NetTcpBinding o NetNamedPipeBinding) brillanti.


Modifica 1

es. ci sarà una singola chiamata nel livello WCF sulla casella fisica 1, ad es. EditEntity (...). Questa chiamata attiverà 2 scritture nel database. Dopo la prima scrittura, un altro client chiama EditEntity (...) per la stessa entità su una seconda istanza del mio servizio WCF su una seconda casella fisica. Nella seconda casella come faccio a sapere che è già in gioco una transazione per questa particolare entità?

Grazie.

È stato utile?

Soluzione

Non sei sicuro di averci dato abbastanza per continuare, ma se sto leggendo correttamente stai cercando di assicurarti di poter supportare una transazione attraverso il tuo servizio WCF? Mentre il tuo DB non supporta le transazioni e i tuoi endpoint WCF si trovano dietro un bilanciamento del carico? Ho questo corretto? Se è così ....

Poiché il tuo DB non ha supporto transazionale, questo passa al tuo livello WCF. Ciò suggerisce un livello approssimativo di granularità nei metodi in modo tale da poter garantire che una singola chiamata al servizio WCF comprenda sufficientemente la transazione. Non distribuire una transazione tra più chiamate WCF, stai chiedendo problemi.


AGGIORNAMENTO: Esistono strategie che possono essere utilizzate con i sistemi di bilanciamento del carico che garantiscono la persistenza tra le connessioni, ma che non ti aiuteranno qui. Se chiami EditEntity () consecutivamente e la prima voce è avviare una transazione e la seconda voce è completare una transazione ... il tuo servizio non è abbastanza granulare.

Consolida queste due chiamate con un metodo, ovvero EditEntityComplete ().

C'è un motivo per cui non è possibile creare un metodo invece di due?


AGGIORNAMENTO # 2: riformulando il problema: un singolo metodo esegue le voci all'interno di un database che non supporta le transazioni. Il metodo in questione esegue una serie di passaggi che devono essere completati in ordine. Il metodo WCF rappresenta le opportunità per la contesa della concorrenza di violare il completamento del passo nell'ordine corretto.

In base a ciò, supponendo che non sia necessario alcun dato di ritorno dalla funzione, prendere in considerazione una coda asincrona in grado di registrare le richieste dagli endpoint WCF. Quindi elaborare la coda da un singolo processo in background.


REVISIONE FINALE:

Riconsidera la necessità di non modificare l'archivio dati.

Dati i requisiti per più client, necessità di ridimensionamento, bilanciamento del carico e supporto transazionale nell'archivio dati, un suggerimento finale: spingere per cambiare il database. Comprendere questo è un requisito statico, ma spenderai molto sforzo nel tentativo di implementare il supporto transazionale quando un sacco di semplici piattaforme di database te lo forniranno. Cercare di ricreare questa funzionalità ha pochi aspetti positivi ma molti aspetti negativi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top