trešdiena, 2011. gada 2. novembris

Service Broker: rindu monitorings

Service Broker (SB) servisi ir visai filigrāna padarīšana. Zemāk daži vaicājumi SB procesa novērošanai un kontrolei, kā arī  pāris komentāri par tiem. [Pēdējo reizi papildināts 2012-08-10].

Vaicājumi rindām
Lai no rindas izņemtu elementus, lieto atslēgvārdu Receive. Savukārt rindas satura pārbaudei var izpildīt parastus Select vaicājumus (insert, update, delete nav atļauti). Izmantojot Receive komandu, SQL Server pilnībā kontrolē ierakstu bloķēšanu, līdz ar to Receive komanda citus neiespaido nekādi savādāk, kā tikai neļaujot apstrādāt to pašu rindas elementu. Savukārt Select vaicājumi var iespaidot rindas apstrādes procesu, tādēļ tiek lietots "With (NoLock)", kas pēc būtības nosaka to, ka vaicājums citus neiespaido (msdn).
Šie divi vaicājumi ir lietojami, ja eksistē attiecīgās rindas. Skatīt "Service Broker: asinhrons trigeris":
-- Vaicājumi, lai apskatītos rindā ievietotos ziņojumus
Select * From dbo.MyTableQueue With (NoLock)
Select * From dbo.ProcessQueue With (NoLock)
Noderīgi katalogu skati
Saraksts ar Service Broker katalogu skatiem atrodams msdn. Šeit daži no tiem:
-- Daži no SB katalogu skatiem
Select * From sys.service_queues
Select * From sys.transmission_queue
Select * From sys.conversation_groups
Select * From sys.conversation_endpoints
-- Palīdz konstatēt "noplūdes"
Select far_service, state_desc, count(*)
From sys.conversation_endpoints with (NoLock)
Group By far_service, state_desc
Order By far_service
Neliels apraskts:
  • sys.service_queues satur datu bāzē esošo rindu nosaukumus un to aprakstu (piemēram, vai rinda ir aktīva, kā sauc aktivizācijas procedūru, ja tāda ir, utt).
  • sys.transmission_queue satur ziņojumus, kas ir "ceļā". Ja ziņojuma galamērķa serviss nav sasniedzams, sūtītie ziņojumi būs redzami šajā skatā. Tāpat šajā skatā būs atrodami ziņojumi, kurus nevar ievietot servisa rindā (ja rinda nav aktīva).
  • sys.conversation_groups iesāktās "sarunas/sarunu grupas", kas nav pabeigtas ar End Conversation atslēgvārdiem. Ja visi ziņojumi ir korekti apstrādāti (process beidzies), tad šajā skatā ierakstu nav.
  • sys.conversation_endpoints - saktā tiek parādīts dialoga process. Šajā skatā var redzēt katru procesa izpildes soli. Veiksmīga procesa rezultātā, katram uzsāktajam dialogam būs viena rinda, ar statusu "Closed". Un svarīgi- ziņojums ar statusu "Closed" no šī skata pazūd apmēram pus stundu pēc šī statusa iegūšanas. Respektīvi- nav gluži tā, ka momentāni pēc uzdevuma apstrādes tiktu dzēstas visas pēdas.
Noderīgi DMV
Saraksts ar Service Broker DMV atrodams msdn. Šeit pāris vaicājumi:
-- Vaicājumi no DMV
SELECT spid, DB_NAME(database_id) database_name, OBJECT_NAME(queue_id) queue_name,
    procedure_name, execute_as
FROM sys.dm_broker_activated_tasks
WHERE database_id = DB_ID();

SELECT DB_NAME(database_id) database_name, OBJECT_NAME(queue_id) queue_name,
    state, last_empty_rowset_time, last_activated_time, tasks_waiting
FROM sys.dm_broker_queue_monitors
WHERE database_id = DB_ID();
Neliels apraksts:
  • sys.dm_broker_activated_tasks - tiek parādīts SPID (sistēmas procesa ID), datu bāzes, rindas un procedūras nosaukumi un lietotājs, kura kontekstā izsaukta procedūra. Ja tiek aktivizētas vairākas procedūras vienlaicīgi, katrai no tām ir sava rinda (katrai arī savs SPID).
  • sys.dm_broker_queue_monitors - parāda rindu aktivizācijas procedūras un kādā stāvoklī tās ir. Šajā skatā var atrast informāciju, kad pēdējo reizi ir aktivizēta procedūra.
SQL Server Log
Ja tiek izmantota aktivizācija- print funkcijas rezultāti un kļūdas, kas netiek apstrādātas, tiek reģistrētas SQL Server Log (plašāk par to apskatīšanu var lasīt rakstā SQL Server audita (Log) faila apskate). Service Broker gadījumā var izmantot komandu, kas no šī audita faila nolasa vajadzīgo informāciju:
EXEC sys.xp_readerrorlog 0, 1, 'Activated'
Ja rindas kaut ko izvada, tad error logs var ātri palikt milzīgs. Tādā gadījumā var noderēt šāda procedūra, kas sāk jaunu failu (normālā gadījumā tas notiek pārstartējot SQL Server):
EXEC sp_cycle_errorlog;
Pārskats, kas nāk kopā ar SSMS instalāciju
Šobrīd neesmu pārliecinājies, vai pārskats ir pieejams SSMS 2005, bet SSMS 2008 R2 noteikti ir.
Lai šo pārskatu attēlotu- SSMS vidē labā poga uz direktorijas "Service Broker", tad izvēlamies "Reports", tad "Standart Reports" un visbeidzot pārskats "Service Broker Statistics".

* Vietējie testi rāda, ka pārskats nedarbojas, ja kādas rindas nosaukumā ir "-". Virsū šai lietai uzskrēju darbojoties ar Query Notification: .NET SqlDependency klase.

Principā pārskatā ir attēlota informāciju, ko var iegūt izmantojot iepriekš aprakstītos katalogu skatus un DMV (ar "+" var izvērst un iegūt papildus informāciju):

    Nav komentāru:

    Ierakstīt komentāru