Routing di Service Broker

In questo argomento viene illustrato in dettaglio il routing dei messaggi di Service Broker. Per una panoramica, vedere Route.

Per la maggior parte delle applicazioni è sufficiente un approccio semplice al routing di Service Broker. In ogni database che contiene un servizio specificare una route per i servizi esterni con i quali il servizio comunica. In Service Broker è tuttavia disponibile un sistema di routing avanzato per la gestione dei casi che richiedono funzionalità più complesse. Per esempi illustrativi del processo di routing, vedere Esempi di routing di Service Broker.

Descrizione del processo di routing

SQL Server mantiene due livelli distinti di informazioni di routing. Ogni database contiene una tabella di routing locale, sys.routes, per le conversazioni avviate nel database. Per le conversazioni che hanno origine nell'istanza di SQL Server, SQL Server esegue la ricerca nella tabella di routing nel database che ha creato la conversazione. Per le conversazioni provenienti dall'esterno dell'istanza, SQL Server esegue la ricerca in msdb.sys.routes.

Il processo di base per l'individuazione di corrispondenze è identico sia per le conversazioni originate all'interno dell'istanza che per quelle create all'esterno. Le route scadute vengono ignorate. Il processo di routing è costituito da tre passaggi distinti:

  1. Ricerca di route corrispondenti. Service Broker individua un set di route possibili attraverso il confronto tra il nome del servizio e l'identificatore di Service Broker.

  2. Scelta di una route. Service Broker sceglie una route dal set di route possibili.

  3. Individuazione del servizio di destinazione. Quando l'indirizzo di rete specificato per la route prescelta è 'LOCAL', Service Broker cerca il servizio nell'istanza. Se il servizio non è presente nell'istanza, Service Broker torna al passaggio 2 e sceglie un'altra route.

Dopo l'invio di un messaggio dall'Initiator alla destinazione e la ricezione del messaggio di acknowledgement da parte dell'Initiator, l'Initiator utilizza l'identificatore di Service Broker nei messaggi di acknowledgement per il routing dei messaggi successivi alla stessa destinazione. Service Broker gestisce i messaggi di acknowledgement con un processo che risulta trasparente per le applicazioni che utilizzano Service Broker. Per ulteriori informazioni sui messaggi di acknowledgement, vedere Protocolli di comunicazione di Service Broker.

Messaggi di risposta da un servizio di destinazione

Quando un messaggio in arrivo dall'esterno dell'istanza proviene da un servizio Target, SQL Server verifica nell'istanza corrente l'eventuale presenza dell'identificatore di Service Broker nel messaggio. Se questo è presente, il messaggio viene recapitato nell'istanza corrente, come descritto nella sezione "Individuazione del servizio di destinazione". In caso contrario, SQL Server segue il processo di corrispondenza standard.

Ricerca di route corrispondenti

Nella procedura seguente viene illustrato il processo utilizzato da SQL Server per la corrispondenza delle route. A ogni passaggio, se viene individuata una corrispondenza con una o più route, il processo termina e Service Broker sceglie una delle route corrispondenti in base a quanto indicato di seguito:

  1. Se nella conversazione è specificato un identificatore di Service Broker, viene cercata una route con una corrispondenza esatta del nome del servizio e dell'identificatore di Service Broker.

  2. Viene cercata una corrispondenza esatta del nome del servizio nelle route per le quali non è specificato un identificatore di Service Broker.

  3. Se per la conversazione non è specificato un identificatore di Service Broker, viene cercata una corrispondenza esatta per il nome del servizio tra le route per le quali è specificato un identificatore di Service Broker. Se la tabella di routing contiene route che corrispondono il nome del servizio e dispongono di identificatori di Service Broker diversi, viene arbitrariamente scelto un identificatore di Service Broker. Viene quindi cercata la corrispondenza solo delle route che utilizzano tale identificatore di Service Broker.

  4. Se esiste una route a un servizio di routing dinamico per il quale non vi sono richieste di route in sospeso, la conversazione viene contrassegnata come posticipata e le informazioni di routing vengono richieste a tale servizio.

  5. Viene cercata una route per la quale non è specificato né il nome del servizio né l'identificatore di Service Broker.

  6. Se la conversazione specifica un identificatore di Service Broker e se l'istanza include uno o più database contenenti servizi con nomi corrispondenti a quello specificato nella conversazione, viene eseguito il routing della conversazione come se nella tabella di routing fosse presente una route con il nome del servizio e l'indirizzo di rete 'LOCAL'.

  7. La conversazione viene contrassegnata come posticipata.

Quando una conversazione è contrassegnata come posticipata, Service Broker ripete il processo di individuazione delle corrispondenze dopo un determinato periodo di timeout. Si noti che la mancata individuazione di una route corrispondente non è considerata un errore.

Scelta di una route

Se vengono individuate più route corrispondenti, Service Broker ne sceglie una. A tale scopo, le route con identificatore di Service Broker, nome del servizio e indirizzo di rete uguali sono considerate identiche. Per scegliere la route esatta, Service Broker utilizza la procedura seguente. Se non vengono individuate route corrispondenti in base all'indirizzo per il passaggio corrente, il processo procede con il passaggio successivo.

  1. Scelta di una route tra quelle per le quali è specificato un indirizzo del server mirror.

  2. Scelta di una route tra quelle per le quali è specificato l'indirizzo di rete 'LOCAL'. Se l'istanza di SQL Server non contiene un servizio con il nome corrispondente a quello specificato nella conversazione, il processo continua con il passaggio 3.

  3. Scelta di una route tra quelle per le quali è specificato un indirizzo di rete.

  4. Scelta di una route tra quelle per le quali è specificato l'indirizzo di rete 'TRANSPORT'.

Se l'inoltro di Service Broker non è attivo, Service Broker elimina il messaggio se la conversazione non proviene dall'istanza corrente e l'indirizzo della route scelta è diverso da 'LOCAL'.

Individuazione del servizio di destinazione

Come illustrato in precedenza, Service Broker recapita i messaggi a un servizio nell'istanza corrente quando nella route corrispondente è specificato l'indirizzo di rete 'LOCAL'. Per i messaggi provenienti dall'esterno dell'istanza, la route deve essere presente in msdb.sys.routes. Per i messaggi che hanno origine nell'istanza, la route corrispondente deve essere presente nella tabella sys.routes per il database che avvia la conversazione.

Quando Service Broker stabilisce che il servizio per il messaggio si trova nell'istanza corrente, Service Broker deve individuare il servizio all'interno dell'istanza. Quando nella conversazione o nella route è presente un identificatore di Service Broker per la conversazione, Service Broker recapita i messaggi al database specificato dall'identificatore di Service Broker.

In caso contrario, Service Broker individua il servizio eseguendo una ricerca del nome del servizio prima nel database che contiene la conversazione, quindi negli altri database nell'istanza. Service Broker recapita il messaggio al primo servizio individuato. Si noti, tuttavia, che l'ordine in cui Service Broker esegue la ricerca negli altri database di un'istanza non è predeterminato e potrebbe essere diverso da una conversazione all'altra. In altre parole, se nell'istanza esistono più copie del servizio di destinazione, Service Broker sceglie in modo casuale il servizio da utilizzare come destinazione.

Altre considerazioni

Per garantire una maggiore affidabilità, il routing di Service Broker prevede misure che impediscono il loop di routing. Il routing di Service Broker tiene conto del mirroring di database ed è in grado di reindirizzare le conversazioni in modo trasparente al partner attivo del mirroring del database.

Loop di routing

La funzione di inoltro dei messaggi di Service Broker tiene traccia del numero di volte in cui un messaggio viene inoltrato, allo scopo di evitare loop di routing senza fine. Per ulteriori informazioni, vedere Inoltro di messaggi di Service Broker.

Se la route corrispondente contiene un indirizzo di rete che si risolve nell'istanza corrente, SQL Server considera la conversazione come proveniente dall'esterno dell'istanza. Service Broker esegue il routing dei messaggi per la conversazione utilizzando le route presenti nella tabella msdb.sys.routes. Il routing di tali messaggi è identico a quello dei messaggi provenienti dall'esterno dell'istanza. In particolare, perché Service Broker inoltri il messaggio a un indirizzo di rete diverso da 'LOCAL' l'inoltro dei messaggi deve essere attivo.

Indirizzi di server mirror

Le route con indirizzi di server mirror hanno precedenza massima nella scelta di una route tra quelle incluse nel set di corrispondenze iniziale. In Service Broker, tuttavia, durante la ricerca di route corrispondenti per una conversazione non viene attribuita una rilevanza particolare agli indirizzi di server mirror.

Quando Service Broker sceglie una route che specifica un indirizzo del mirror e che in precedenza non è stata utilizzata da Service Broker per il recapito di un messaggio, Service Broker invia una richiesta a entrambi gli indirizzi per determinare l'istanza che attualmente rappresenta l'entità. Quando Service Broker identifica l'entità, tutti i messaggi che utilizzano la route vengono inviati ad essa da Service Broker, senza contattare l'istanza del mirror. Se l'entità non è raggiungibile o se l'istanza corrispondente non costituisce più l'entità e se l'istanza di SQL Server all'altro indirizzo della coppia è identificata come nuova entità, i messaggi vengono inviati da Service Broker all'altro indirizzo della coppia.

Nei casi in cui Service Broker non è in grado di raggiungere l'entità , ma il partner non dichiara di essere la nuova entità, Service Broker non invia i messaggi al partner. Vengono quindi eseguiti nuovi tentativi di utilizzo dell'indirizzo dell'entità e del partner da parte di Service Broker fino a quando non è possibile raggiungere l'entità o il partner non viene identificato come nuova entità. Questo approccio consente a Service Broker di recapitare i messaggi in modo affidabile quando l'entità e il partner possono comunicare, ma l'istanza che invia il messaggio non è in grado di raggiungere l'entità.