Informazioni sull'esecuzione dell'attivazione

Il processo di attivazione di Service Broker è costituito da due passaggi. Nel primo passaggio Service Broker determina se l'attivazione è necessaria, mentre nel secondo passaggio Service Broker determina se l'attivazione viene eseguita. Sebbene il processo esatto sia diverso per l'attivazione interna e per quella esterna, i concetti complessivi da tenere in considerazione sono gli stessi per entrambe le strategie.

Come determinare se l'attivazione è necessaria

L'attivazione è necessaria tutte le volte che sono presenti operazioni che un nuovo agente di lettura coda dovrebbe eseguire. I monitor di coda determinano se l'attivazione è necessaria. Service Broker crea un monitor di coda per ogni coda per cui è specificata l'impostazione STATUS = ON relativa all'attivazione o per cui è stata registrata una notifica degli eventi QUEUE_ACTIVATION. I monitor di coda attivi nell'istanza vengono elencati nella vista a gestione dinamica descritta in sys.dm_broker_queue_monitors (Transact-SQL). Ogni monitor di coda tiene traccia degli elementi seguenti:

Eventuale presenza di messaggi nella coda pronti per la ricezione

Ultima restituzione di un set di risultati vuoto da parte di un'istruzione RECEIVE eseguita sulla coda

Numero di stored procedure di attivazione attualmente in esecuzione per la coda

Un monitor di coda controlla se l'attivazione è necessaria a intervalli di pochi secondi e tutte le volte che si verificano uno o più degli eventi seguenti:

  • Arrivo di un nuovo messaggio nella coda.

  • Esecuzione in SQL Server di un'istruzione RECEIVE per la coda.

  • Rollback di una transazione che contiene un'istruzione RECEIVE.

  • Uscita da tutte le stored procedure avviate dal monitor di coda.

  • Esecuzione in SQL Server di un'istruzione ALTER per la coda.

L'attivazione è necessaria se si verifica una delle situazioni seguenti:

  • Arrivo di un nuovo messaggio in una coda che non contiene alcun messaggio non letto e assenza di stored procedure di attivazione in esecuzione per la coda.

  • Presenza di messaggi non letti nella coda, assenza di sessioni in attesa in un'istruzione GET CONVERSATION GROUP oppure in un'istruzione RECEIVE senza una clausola WHERE e nessuna restituzione di un set di risultati vuoto in un intervallo di pochi secondi da parte di un'istruzione GET CONVERSATION GROUP o di un'istruzione RECEIVE senza una clausola WHERE. In altri termini, questa situazione si verifica quando i messaggi si accumulano nella coda poiché le procedure attivate non sono in grado di leggerli in modo sufficientemente veloce.

Questa procedura consente al monitor di coda di indicare se il numero di agenti di lettura coda che elaborano la coda è sufficiente per gestire il traffico di messaggi in arrivo. Si noti che questo approccio tiene conto del blocco del gruppo di conversazioni. Poiché i messaggi per una conversazione possono essere elaborati solo da un agente di lettura coda alla volta, l'avvio di agenti di lettura coda in risposta a un approccio più semplice, ad esempio il numero di messaggi non letti presenti nella coda, potrebbe provocare uno spreco di risorse. Al contrario, l'attivazione di Service Broker valuta se sono presenti operazioni che un nuovo agente di lettura coda dovrà eseguire.

Una coda può contenere ad esempio un numero elevato di messaggi non elaborati in un'unica conversazione. In questo caso, solo un agente di lettura coda può elaborare i messaggi. Se il monitor di coda attiva un altro agente di lettura coda, tale agente rimane in attesa nell'istruzione RECEIVE poiché tutti i messaggi appartengono a un'unica conversazione. Fino a quando tutti i messaggi nella coda appartengono alla stessa conversazione e il secondo agente di lettura coda rimane in esecuzione, il monitor di coda non avvia un altro agente di lettura coda.

Come determinare se l'attivazione viene eseguita

Dopo avere determinato che l'attivazione è necessaria, Service Broker deve decidere se l'attivazione viene eseguita.

Per l'attivazione interna, il monitor di coda avvia una nuova istanza della stored procedure di attivazione quando il numero di programmi in esecuzione è minore del valore MAX_QUEUE_READERS impostato per la coda. Se il numero di programmi in esecuzione è uguale o maggiore del valore MAX_QUEUE_READERS, il monitor di coda non avvia una nuova istanza della stored procedure. Le informazioni sulle stored procedure avviate da Service Broker sono contenute nella vista a gestione dinamica sys.dm_broker_activated_tasks (Transact-SQL).

Per le applicazioni esterne, Service Broker non dispone di alcuna informazione sul numero di agenti di lettura coda distinti utilizzati con la coda. Potrebbe inoltre essere necessario del tempo di avvio tra il momento in cui viene generato l'evento di attivazione e il momento in cui un agente di lettura inizia a leggere la coda. Di conseguenza, in Service Broker è disponibile un timeout per la risposta di un'applicazione esterna durante il quale Service Broker non genererà un'altra notifica. Dopo che un'applicazione ha chiamato RECEIVE sulla coda o dopo la scadenza del timeout, se l'attivazione è necessaria Service Broker crea un'altra notifica degli eventi. Un'applicazione esterna esegue il monitoraggio delle notifiche degli eventi mentre il programma è in esecuzione per determinare se sono necessari più agenti di lettura coda per leggere gli eventi.