Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Gruppi di conversazione di SQL Server Service Broker

I gruppi di conversazione sono una primitiva locale utilizzata per il blocco. I messaggi all'interno di un gruppo di conversazioni non hanno garanzie di ordine e i gruppi di conversazioni non passano attraverso il filo.

L'ordine dei messaggi è garantito da Service Broker all'interno di una conversazione. Quindi, per preservare l'ordine dei messaggi corretti in elaborazione, inviali nella stessa conversazione.

I gruppi di conversazione sono necessari per raggruppare una serie di conversazioni correlate tra loro. Entrambi GET CONVERSATION GROUP e RECEIVE i verbi garantiscono che bloccheranno un intero gruppo di conversione, impedendo così a qualsiasi altro thread di elaborare messaggi correlati. Si consideri ad esempio un sito itinerante. Riceve un messaggio con la richiesta di prenotare un pacchetto vacanza. Di conseguenza avvia una conversazione con un servizio di prenotazione alberghiera e invia una richiesta di prenotazione di una camera, avvia una conversazione con un servizio di prenotazione di una compagnia aerea e richiede la prenotazione del viaggio, avvia una conversazione con un servizio di agenzia di autonoleggio e chiede un prenotazione auto. Queste tre nuove conversazioni che ha creato sono tutte nello stesso gruppo con la conversazione iniziale in cui è stata ricevuta la richiesta (l'applicazione ha utilizzato il WITH RELATED_CONVERSATION clausola di BEGIN DIALOG su tutti e 3). Quindi esegue il commit e procede all'elaborazione dei messaggi nella coda. Le risposte successive a queste 3 richieste correlate iniziano ad arrivare, praticamente in momenti casuali. Supponiamo che la risposta dell'hotel arrivi per prima. Il messaggio viene raccolto dall'applicazione e procede all'aggiornamento dello stato della richiesta con la risposta dell'hotel. Allo stesso tempo, arriva la risposta della compagnia aerea. Se un altro thread fosse autorizzato a raccoglierlo, proverebbe ad aggiornare lo stato dello stesso richiesta, con conseguente blocco o addirittura deadlock contro il thread che sta elaborando la risposta dell'hotel. Quando la risposta dell'hotel viene elaborata, il thread si impegna e quindi sblocca l'intero gruppo di conversazioni, consentendo a qualsiasi thread (incluso se stesso) di raccogliere la risposta della compagnia aerea ed elaborarla.