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 originate all'interno dell'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 all'interno dell'istanza. Se il servizio non esiste nell'istanza, Service Broker torna al passaggio 2 e sceglie un'altra route.

Dopo l'invio di un messaggio alla destinazione e la ricezione del messaggio di acknowledgement da parte della destinazione stessa, 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 di destinazione, SQL Server verifica nell'istanza corrente l'eventuale presenza dell'identificatore di Service Broker del messaggio. In caso affermativo il messaggio viene recapitato all'interno dell'istanza corrente, come descritto nella sezione "Individuazione del servizio di destinazione" di seguito in questo argomento. 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 indicate di seguito:

  1. Se nella conversazione è specificato un identificatore di Service Broker, viene cercata una route con nome del servizio e identificatore di Service Broker esattamente corrispondenti.
  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 in base al nome del servizio tra le route per le quali è specificato un identificatore di Service Broker. Se la tabella di routing contiene route con nome del servizio corrispondente ma diversi identificatori di Service Broker, viene scelto arbitrariamente un identificatore di Service Broker. La corrispondenza viene quindi rilevata solo con le route che utilizzano tale identificatore.
  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 il nome del servizio o l'identificatore di Service Broker.
  6. Se la conversazione specifica un identificatore di Service Broker e se l'istanza include almeno un database contenente servizi con nomi corrispondenti a quello specificato nella conversazione, il routing della conversazione viene eseguito 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 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 provenienti dall'interno dell'istanza, la route corrispondente deve essere presente nella tabella sys.routes per il database che avvia la conversazione.

Una volta stabilito 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 cercando il nome del servizio innanzitutto nel database contenente la conversazione e quindi negli altri database nell'istanza. Il messaggio viene recapitato 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 server mirror e che in precedenza non è stata utilizzata per il recapito di un messaggio, invia una richiesta a entrambi gli indirizzi per determinare l'istanza che rappresenta l'entità. Una volta identificata l'entità, tutti i messaggi che utilizzano la route verranno inviati ad essa, senza contattare l'istanza del server mirror. Se l'entità non è raggiungibile o 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 all'altro indirizzo della coppia.

Se Service Broker non è in grado di raggiungere l'entità e il partner non costituisce la nuova entità, i messaggi non vengono inviati al partner ma vengono tentati nuovamente gli indirizzi dell'entità e del partner finché la prima non è raggiungibile o il secondo non assume il ruolo di 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à.

Vedere anche

Concetti

Inoltro di messaggi di Service Broker
Protocolli di comunicazione di Service Broker

Altre risorse

sys.routes (Transact-SQL)
CREATE ROUTE (Transact-SQL)
ALTER ROUTE (Transact-SQL)
DROP ROUTE (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005