SQL
Server Service Broker
SQL Server Service Broker يك زيرسيستم جديد است كه پشتيباني صفبندي غيرهمزمان تضمين شده
را به SQL
Server 2005 اضافه كرده است.
صفبندي غير همزمان، بْعدي از مقياسپذيري را به SQL Server 2005 اضافه ميكند. صفبندي غيرهمزمان كه در بيشتر برنامههاي با
مقياسپذيري بالاي ديگر وجود دارد، شامل زيرسيستمهاي I/O سيستم عامل، سرورهاي وب و حتي عمليات داخلي خود موتور پايگاه داده
SQL
Server است. افزودن صفبندي
غيرهمزمان به SQL
Server 2005، قابليت مديريت صفبندي
غيرهمزمان را براي برنامههاي پايگاه داده كاربر نهايي نيز به همراه دارد. صفبندي
غيرهمزمان عامل مهمي براي مقياسپذيري است، زيرا به برنامه اجازه پاسخگويي به
درخواستهايي بيشتر از محيط را كه ممكن است قادر به مديريت فيزيكي باشند، ميدهد.
براي نمونه، درمورد يك سرور وب، چنانچه ده هزار كاربر بهطور همزمان منابعي را
از سرور درخواست كنند، بدون صفبندي غيرهمزمان، سرور وب مستأصل خواهد شد، زيرا
تلاش ميكند تا رشتههايي را براي مديريت تمام درخواستهاي وارده مديريت كند. صفبندي
غيرهمزمان، صفبندي تمام درخواستها را براي قرار گرفتن در يك صف ممكن ميسازد.
بنابراين بهجاي مستأصل شدن، سرور وب ميتواند وروديها را از صف با حداكثر سطوح
كارآيي پردازش كند. در مورد سرور وب، صفبندي غيرهمزمان به سرور امكان مديريت
مؤثر تعداد اتصالات كاربر بيشتري را ميدهد. SQL Server Service
Broker به شما امكان ساخت
اين نوع مقياسپذيري مشابه را در برنامههاي پايگاه داده ميدهد.
در اين فصل، مطالبي درباره ويژگيهاي
جديد فراهم شده توسط SQL Server Service Broker
ميآموزيد. مروري بر زيرسيستم جديد خواهيد داشت و مطالبي درباره اجزاي اصلي آن ميآموزيد.
سپس اصول ايجاد برنامههاي SQL Server Service Broker را خواهيد ديد. در اينجا مطالبي درباره فوق داده SQL Server Service
Broker و مدل برنامهنويسي
آن ميآموزيد. ابتدا، نحوه ايجاد صفها و انواع پيام را خواهيد ديد. سپس، نحوه
استفاده از فرامين T-SQL جديد را خواهيد ديد كه به برنامههاي پيامرساني امكان افزودن
وروديها به يك صف و دريافت وروديهايي كه به صف اضافه شدهاند، ميدهد. بالاخره،
مطالبي درباره برخي از ويژگيهاي راهبري موجود در زيرسيستم SQL Server Service
Broker ميآموزيد.
SQL Server Service Broker توانايي انجام صفبندي غير همزمان را به SQL Server 2005 اضافه كرده است. قابليت صفبندي جديد در موتور SQL Server ساخته شده است و كاملاً تراكنشي است. تراكنشها ميتوانند
رويدادهاي صفبندي شده را مشاركت دهند و ميتوانند commit يا roll back
شوند. ميتوانيد با استفاده از عبارات SQL
جديد، به SQL
Server Service Broker
دستيابي داشته باشيد. مثالهايي از اين فرامين در بخش بعدي اين فصل ارايه شده است.
علاوه بر اين، SQL
Server Service Broker
جديد همچنين از تحويل قابل اتكاي پيامها به صفهاي راه دور پشتيباني ميكند. اين
بدان معني است كه برنامههاي صفبندي كه با استفاده از SQL Server Service
Broker ساخته شوند ميتوانند
چندين سيستم SQL
Server را به وجود آورند
و باز هم تحويل پيام تضمين شده را فراهم ميكنند، حتي براي صفهاي راهدور. پيامهايي
كه در بين صفها ارسال ميشوند، ميتوانند بسيار بزرگ باشند (تا 2GB). SQL Server Service
Broker به روشهاي مورد
نياز براي تقسيمبندي پيامهاي بزرگ در قطعات كوچكتري انجام خواهد داد كه در بين
شبكه ارسال شده و سپس در نهايت آنها را مجدداً اسمبل ميكند. هر دو نگارش 32 و 64
بيتي SQL
Server Service Broker
وجود دارد.
در حالي كه ايده صفبندي در برنامهها
ممكن است براي بيشتر طراحان پايگاه داده كمي عجيب به نظر رسد، صفها معمولاً در
برنامههاي با مقياسپذيري بالا هستند. يكي از معروفترين اين نوع برنامهها،
سيستمهاي رزرواسيون خطوط هوايي مورد استفاده توسط خطوط هواپيمايي عمده نظير United، Delta و American و توسط دلالان مسافرتي نظير Expedia و CheapTickets.com است. براي داشتن ايدهاي در مورد نحوه استفاده صفبندي در يكي از
اين برنامهها، ميتوانيد به شكل 1-6 مراجعه كنيد كه ميتوانيد طراحي يك برنامه صفبندي
شده ساده را ببينيد.
شكل 1-6 مروري سطح بالا از يك سيستم
رزرواسيون هواپيمايي نمونه را نشان ميدهد. در اينجا ميتوانيد ببينيد كه لايه
ارايه برنامه توسط برنامهاي كه روي يك بستر وب اجرا ميشود، به مرور به كاربر
نهايي تحويل ميشود. اين برنامه ميتواند با استفاده از ASP.NET يا تعدادي از ساير زبانهاي برنامهنويسي نوشته شود. سپس برنامه front end با سيستم رزرواسيون واقعي محاوره خواهد كرد كه بهطور طبيعي روي
سيستم ديگري اجرا ميشود.

به دليل اين كه برنامههايي نظير اينها
بايد از هزاران كاربر همزمان پشتيباني كنند، آنها نميتوانند قفل رديفها را
فراهم كنند، در حالي كه يك كاربر معين منتظر ميماند تا در مورد جزييات نهايي يك
پرواز تصميمگيري كند يا حتي يك رزرواسيون را شروع كند و سپس اجرا شود و براي
خاتمه برنامهريزي كند. قفلگذاري رديفي در اين نوع روش، بهطور جدي مانع از مقياسپذيري
و حتي قابليت استفاده برنامه ميشود. صفبندي اين مشكل را با دادن امكان انجام يك
درخواست غيرهمزمان براي يك رزرواسيون برطرف ميكند و درخواستي را به سيستم رزرواسيون
back-end ارسال كرده و بلافاصله براي كار ديگر آزاد ميشود. در هيچ جايي از
فرآيند تعيين رزرواسيون، هيچ قفلي روي جداول پايگاه داده نداريم. سيستم رزرواسيون back-end كه لزوماً در حالت دستهاي كار ميكند، درخواست رزرواسيون را خارج
از صف خواهد گرفت و سپس بهنگامرساني پايگاه داده را انجام ميدهد. با توجه به اين
كه بهنگامرساني در حالت دستهاي و بدون محاوره كاربر انجام ميشود و سريعاً اتفاق
ميافتد و حداقل زمان براي قفل كردن رديفها مورد نياز است، در حالي كه بهنگامرساني
انجام ميشود. اگر درخواست موفق باشد، رزرواسيون كاربر نهايي تأييد ميشود. در غير
اين صورت، اگر درخواستي به اين دليل پذيرفته نشود كه تمام صندليها رزرو شدهاند و
يا به دلايل ديگر، آنگاه رزرواسيون پذيرفته نخواهد شد و كاربر از اين وضعيت مطلع
ميشود.
گفتگوها يك جزء ضروري SQL Server Service
Broker جديد مايكروسافت هستند.
لزوماً، گفتگوها[1]
پيامرساني دو روشه را بين دو نقطه انتهايي فراهم ميكنند. نقاط انتهايي براي اين
پيامها ميتوانند دو برنامهاي باشند كه روي نمونهها يا سرورهاي متفاوتي اجرا ميشوند
يا ميتوانند دو برنامهاي باشند كه روي يك سرور اجرا ميشوند. شكل 2-6 گفتگوي SQL Server Service
Broker را نشان ميدهد.

هدف اصلي يك گفتگوي SQL Server Service
Broker، فراهم كردن
دنبالهاي مرتب از رويدادهاست. گفتگوهاي SQL Server Service Broker ترتيب رويداد قابل اتكايي را در بين سرور و يا رشتهها حفظ ميكنند،
حتي اگر خرابي شبكه، برنامه يا سرور وجود داشته باشد و بهطور موقت پردازش
رويدادهاي صفبندي شده را مختل كرده باشد. هنگامي كه پردازش صفي بازيابي ميشود،
رويدادها به ترتيب به پردازش شدن ادامه ميدهند كه از محل آخرين رويداد صفبندي
شده پردازش انجام ميشود. گفتگوها به پيامهاي صفبندي شده امكان ميدهند تا به
همان ترتيبي خوانده شوند كه در صف قرار دارند. گفتگوها ميتوانند براي پردازش
رويدادها به حالت full-duplex يا حالت half-duplex
تنظيم شوند.
جزء اصلي ديگر زير سيستم SQL Server Service
Broker، گروه مكالمه است.
گروه مكالمه[2]
به مجموعهاي از گفتگوهاي SQL Server Service Broker مرتبط است. يك برنامه ممكن است براي تكميل يك وظيفه، نياز به
چندين گفتگو داشته باشد و يك گروه مطالعه به شما امكان ميدهد تا تمام اين
گفتگوهاي مرتبط را با يكديگر بهطور منطقي گروهبندي كنيد. مثلاً، يك برنامه ورودي
سفارش ممكن است گفتگويي براي پردازش سفارشات داشته باشد، ديگري صورتحساب را
پردازش كند، ديگري خريد را مديريت كند و باز هم ديگري درخواستهاي حوالهاي را
مديريت كند. تمام اين گفتگوهاي مرتبط ميتوانند با يكديگر گروهبندي شوند تا يك
گروه مكالمه را تشكيل دهند. در اين مورد، گروه مكالمه اصولاً تمام گفتگوها را براي
يك برنامه نشان ميدهد. شكل 3-6 رابطه گروه مكالمه و گفتگوي SQL Server Service
Broker را نشان ميدهد.

هدف اصلي تحت گروه مكالمه، فراهم كردن يك
مكانيزيم قفلگذاري براي صفهاي مرتبط است. در اين صحنه، مهم درك اين نكته است كه
قفلگذاري بر هر جدول پايگاه داده مرتبط اعمال نميشود. در عوض، قفلگذاري كه توسط
گروه مكالمه ميسر ميشود، بر موجوديتهايي در صفها اعمال ميشود. در مورد يك
سفارش، اين امر ممكن است بدين معني باشد كه هيچ فرآيندي نميتواند براي هر يك از
صفها در گروه مكالمه شما، سفارشات را بخواند، در حالي كه برنامه شما قفلي را روي
اين وروديها گذاشته است.
علاوه بر قفلگذاري، گروه مكالمه به
برنامه امكان نگهداري حالت را نيز ميدهد. نگهداري حالت هميشه يكي از مشكلترين
جنبههاي يك برنامه غيرهمزمان بوده است، زيرا ميتواند باعث تأخيرهاي طولاني بين
رسيدن پيامها شود. باز نگه داشتن رشتههاي فعال در طي آن دوره زماني يك راهحل
نيست، زيرا تمام رشتههاي بياستفاده، منابع سيستم را به شدت مصرف ميكنند و مقياسپذيري
را پايين ميآورند. در عوض، گروه مكالمه حالت يك موجوديت را با استفاده از يك جدول
حالت نگهداري ميكند. گروه مكالمه از يك ID
نمونه (يك GUID) به عنوان كليد اصلي براي تعيين وروديها در گروه صفها استفاده
ميكند.
فعالسازي SQL Server Service
Broker ويژگي منحصر به
فرد ديگري از زيرسيستم SQL Server Service Broker
است. فعالسازي به شما امكان ايجاد رويه ذخيره شدهاي را ميدهد كه مربوط به يك صف
ورودي داده شده است. هدف رويه ذخيره شده، پردازش خودكار پيامها از آن صف است.
هنگامي كه پيام جديدي ميرسد، رويه ذخيره شده مرتبط بهطور خودكار براي مديريت
پيامهاي ورودي اجرا ميشود. اگر رويه ذخيره شده با خطايي مواجه شود، ميتواند
استثنايي را به وجود آورده و بهطور خودكار بازيافت شود.
بهطور پريوديك، SQL Server Service
Broker وضعيت صف ورودي را
بررسي ميكند آيا رويه ذخيره شده پيامهاي ورودي را در صف ورودي نگه ميدارد. اگر SQL Server Service
Broker تعيين كند كه پيامهاي
در حال انتظاري در صف وجود دارند، آنگاه بهطور خودكار نمونه ديگري از خواننده صف
را براي پردازش پيامهاي اضافي شروع ميكند. اين فرآيند شروع خودكار خوانندههاي
صف اضافي ميتواند تا وقتي ادامه يابد كه به مقدار MAX_QUEUE_READERS از پيش تنظيم شده برسد. ضمناً، هنگامي كه SQL Server Service
Broker تعيين ميكند كه
هيچ پيامي در صف باقي نمانده است، كاهش تعداد خوانندههاي صف فعال را بهطور
خودكار شروع ميكند.
صفها لزوماً نبايد به رويههاي ذخيره
شده مرتبط شوند. پيامهايي كه نياز به پردازش پيچيدهتري دارند، همچنين ميتوانند
به رويههاي رديف مياني مرتبط شوند. براي انجام فعالسازي خودكار فرآيندهاي خارجي،
SQL Server
Service Broker همچنين از اجراي
يك رويداد SQL
Server پشتيباني ميكند.
اين رويدادها ميتوانند براي استفاده از WMI[3] مشترك شوند. در
اين مورد، هنگامي كه رويداد در صف ميآيد، رويداد SQL Server اجرا شده و توسط مشترك WMI
خوانده ميشود كه به نوبت خواننده صف خارجي را شروع ميكند.
پروتكل انتقال پيام SQL Server Service
Broker به پيامها امكان
ارسال روي شبكه را ميدهد. انتقال پيام SQL Server Service Broker بر طبق TCP/IP
است و معماري كلي انتقال پيام SQL Server Service Broker كمي شبيه معماري مورد استفاده TCP/IP و FTP است. انتقال پيام SQL Server Service Broker مركب از دو پروتكل است: پروتكل Binary Adjacent
Broker كه يك پروتكل سطح
پايين شبيه TCP است و پروتكل Dialog
كه يك پروتكل سطح بالاتر شبيه FTP
است و در بالاي پروتكل Binary Adjacent Broker
قرار دارد.
پروتكل
Binary
Adjacent Broker
پروتكل Binary Adjacent
Broker يك پروتكل TCP/IP سطح پايين بسيار كارآمد است كه انتقال پيام پايه را فراهم ميكند.
اين يك پروتكل دو جهته و مولتي پلكس شده است و بنابراين ميتواند انتقال پيام را
براي چند گفتگوي SQL
Server Service Broker
مديريت كند. پروتكل Binary Adjacent Broker
درباره ترتيب پيام يا تأييد تحويل پيام نگراني ندارد. همه چيز توسط پروتكل Dialog مديريت ميشود. در عوض، پروتكل Binary Adjacent
Broker به سادگي پيامها
را روي شبكه و با سرعت ممكن ارسال ميكند.
پروتكل
Dialog
پروتكل Dialog ارتباطات انتها به انتها را براي يك گفتگوي SQL Server Service
Broker مديريت ميكند.
اين پروتكل براي تحويل طبق ترتيب و تنها يك دفعهاي پيامها طراحي شده است، ارسال
پيامها و تأييد آنها را مديريت ميكند. همچنين مديريت خرابي متقارن را فراهم ميكند
كه هر دو گره انتها از خرابي تحويل هر پيامي مطلع ميشوند. علاوه بر اين، پروتكل Dialog مسئول تعيين هويت و رمزگذاري پيامهاست.
همانگونه كه در اولين بخش اين فصل بيان
شد، SQL
Server Service Broker
زيرسيستمي است كه برنامهنويسي برنامههاي پيامرساني مبتني بر پايگاه داده را
ممكن ميسازد. در حالي كه اولين بخش اين فصل شما را با مروري از اجزاي اصلي
زيرسيستم SQL
Server Service Broker
مهيا ميسازد و ايدهاي از توابع و ارتباطات متقابل اين اجزا را به شما ميدهد،
اين بخش به بررسي عمقيتر ميپردازد و شما را با يك ارايه خلاصه از نحوه نوشتن
برنامهها با استفاده از SQL Server Service Broker
مهيا ميكند.
SQL Server Service Broker مجموعهاي از فوق داده را براي توصيف انواع پيامهايي كه يك
برنامه ميتواند دريافت كند به كار ميبرد كه جهتهاي ارسال و نحوه ارتباط پيامها
هستند. لزوماً، فوق داده SQL Server Service Broker
شالوده پيامرساني مورد استفاده برنامه را توصيف ميكند. علاوه بر اين، اين فوق
داده داراي مجوزهاي مرتبطي است كه ميتوانند براي ايمن ساختن برنامه پيامرساني استفاده
شوند. شكل 4-6 مدل فوق داده SQL Server Service Broker را تشريح ميكند.

نوع پيام[4]، اساسيترين
شئ در فوق داده SQL
Server Service Broker
است.
اين نوع پيام براي بيان پيامهايي كه به
كار خواهند رفت، استفاده ميشود. براي پيامهاي XML، انواع پيام ميتوانند يك طرحواره اختياري مربوط به پيام داشته
باشند. اگر يك طرحواره مرتبط وجود داشته باشد، SQL Server Service
Broker اطمينان خواهد داد
كه پيام با تعريف طرحواره كامپايل ميشود. اگر هيچ طرحوارهاي وجود نداشته باشد،
با پيامها به عنوان داده باينري رفتار ميشود.
شئ اصلي بعدي در فوق داده SQL Server Service
Broker، قرارداد[5] است. انواع
پيامها در قراردادها گروهبندي ميشوند. قرارداد تمام پيامهايي را توصيف ميكند
كه ميتوانند با استفاده از گفتگوي خاصي دريافت شوند. مثلاً، اگر يك گفتگوي
درخواست و پاسخ رزرواسيون ساده را تشكيل دهد، قرارداد مشخص خواهد كرد كه اين دو
نوع پيام با يكديگر گروهبندي شده و به سيستم رزرواسيون مرتبط ميشوند. قرارداد
لزوماً مشخص ميكند كدام نوع پيامها توسط يك گفتگوي معين مجاز است.
قراردادها براي تشكيل يك سرويس[6] با يكديگر
گروهبندي ميشوند كه لزوماً تمام گفتگوهايي را نشان ميدهد كه براي پردازش پيامها
براي آن سرويس مورد نياز هستند. يك سرويس به يك يا چند صف مرتبط ميشود و شئ اصلي
است كه توسط برنامه SQL Server Service Broker
سامان مييابد. برنامه يك گفتگو را براي يك سرويس باز ميكند. برنامه با جزييات
فيزيكي نحوه پيادهسازي سرويس كاري ندارد، زيرا جزييات پيادهسازي فيزيكي توسط فوق
داده تعريف ميشود. اين صف حاوي پيامهايي است كه توسط يك برنامه SQL Server Service
Broker دريافت ميشوند.
T-SQL
با چندين عبارت جديد كه يكپارچگي طبيعي پيامرساني SQL Server Service
Broker را با رويههاي
پايگاه داده متداول ممكن ميسازند، بهبود يافته است. جدول 1-6 عبارات DDL جديد T-SQL
را خلاصه كرده است كه براي ايجاد اشياي SQL Server Service Broker استفاده ميشوند.
|
T-SQL
DDL |
شرح |
|
CREATE MESSAGE TYPE |
نوعي
پيام جديدي ايجاد ميكند. |
|
CREATE CONTRACT |
قرارداد
جديدي را در پايگاه داده ايجاد ميكند. |
|
CREATE QUEUE |
صف
جديدي را در پايگاه داده ايجاد ميكند. |
|
CREATE ROUTE |
مسير
جديدي را در پايگاه داده ايجاد ميكند. |
|
CREATE SERVICE |
سرويس
جديدي را در پايگاه داده ايجاد ميكند. |
|
ALTER MESSAGE TYPE |
نوع
پيام را تغيير ميدهد. |
|
ALTER CONTRACT |
قرارداد
پيام را تغيير ميدهد. |
|
ALTER QUEUE |
صف
پيام را تغيير ميدهد. |
|
ALTER ROUTE |
مسير
پيام را تغيير ميدهد. |
|
ALTER SERVICE |
سرويس
پيام را تغيير ميدهد. |
|
DROP MESSAGE TYPE |
نوعي
پيام را از پايگاه داده حذف ميكند. |
|
DROP CONTRACT |
قراردادي
را از پايگاه داده حذف ميكند. |
|
DROP QUEUE |
صفي
را از پايگاه داده حذف ميكند. |
|
DROP ROUTE |
مسيري
را از پايگاه داده حذف ميكند. |
|
DROP SERVICE |
سرويسي
را از پايگاه داده حذف ميكند. |
علاوه بر عبارات T-SQL DDL جديد كه براي ايجاد اشياي SQL Server Service Broker جديد استفاده ميشوند. همچنين گروهي از عبارات T-SQL وجود دارند كه با پيامها در يك برنامه SQL Server Service
Broker كار ميكنند. جدول
2-6 عبارات T-SQL
DML مربوط به SQL Server Service
Broker جديد را فهرست
كرده است.
|
T-SQL DML |
شرح |
|
BEGIN DIALOG |
گفتگويي
را باز ميكند. |
|
END CONVERSATION |
مكالمه
مورد استفاده يك گفتگو را حذف ميكند. |
|
MOVE CONVERSATION |
مكالمهاي
را به يك گفگوي جديد منتقل ميكند. |
|
GET SERVICE INSTANCE |
ID يك نمونه سرويس را از يك صف بازيابي ميكند. |
|
RECEIVE |
پيامي
را از يك صف بازيابي ميكند. |
|
SEND |
تايمري
را شروع ميكند. هنگامي كه تايمر منقضي ميشود. |
|
BEGIN CONVERSATION
TIMER |
Service
Broker يك پيام را در
صف قرار ميدهد. |
در اولين قسمت اين بخش، مرور سطح بالايي
از نحوه استفاده از SQL Server Service Broker
براي نوشتن برنامههاي پيامرساني غيرهمزمان داشتيد. اين بخش هماكنون به تشريح
عمقيتر نحوه استفاده از T-SQL
براي ايجاد اشياي SQL
Server Service Broker
مورد نياز ميپردازد و نحوه استفاده از آنها را در يك برنامه ساده نشان ميدهد.
برنامه نمونه يك سيستم رزرواسيون ساده است كه يك درخواست رزرواسيون ساده را در يك
صف ورودي پذيرفته و آنگاه به پيامي در يك صف پاسخ، جواب ميدهد.
ايجاد
اشياي SQL
Server Service Broker
كدي كه براي ايجاد اشياي SQL Server Service
Broker مورد نياز استفاده
ميشود، در اين ليست نشان داده شده است:
CREATE MESSAGE TYPE ResRequest ENCODING varbinaryCREATE MESSAGE TYPE ResResponse ENCODING varbinary CREATE CONTRACT ResContract (ResRequest SENT BY any, ResResponse SENT BY any) CREATE QUEUE ResRequestQueue WITH ACTIVATION (STATUS = ON, PROCEDURE_NAME = ResRequestProc, MAX_QUEUE_READERS = 5, EXECUTE AS SELF) CREATE QUEUE ResResponseQueue CREATE SERVICE ResRequestService ON QUEUE ResRequestQueue(ResContract) CREATE SERVICE ResResponseService ON QUEUE ResResponseQueue(ResContract)
اولين مرحله ايجاد برنامه SQL Server Service
Broker، ايجاد انواع پيام
است كه پيامهايي را بيان ميكند كه ارسال خواهند شد. دو عبارت اول، دو نوع پيام
ساده را ايجاد ميكند. اولين پارامتر براي نامگذاري نوع پيام استفاده ميشود و
كلمه كليدي ENCODING نشان ميدهد آيا پيام باينري خواهد بود يا XML. در اين مثال، هر دو نوع پيام (ResRequest و ResResponse) به عنوان پيامهاي باينري ايجاد ميشوند، بدين معني كه آنها هر
نوع داده را خواهند پذيرفت.
سپس، قراردادي ايجاد ميشود. اين
قرارداد، تمام پيامهايي را كه ميتوانند با استفاده از يك گفتگوي خاص دريافت
شوند، توصيف ميكند. بخش SENT BY
براي طراحي پيامهاي مربوط به قرارداد و محل آمدن اين پيامها استفاده ميشود.
سپس، صفها بايد ايجاد شوند. اين مثال
ايجاد دو صف را نشان ميدهد: ResRequestQueue
و ResResponseQueue. ResRequestQueue از كلمه كليدي ACTIVATION
براي اجراي خودكار رويه ذخيره شدهاي استفاده ميكند كه محتويات صف را خواهد
خواند. اين رويه ذخيره شده بايد در زمان ايجاد صف وجود داشته باشد، در غير اين
صورت، خطايي توليد خواهد شد. رويه ذخيره شده ResRequest در ادامه نشان داده ميشود. كلمه كليدي MAX_QUEUE_READERS حداكثر تعداد خوانندگاني را مشخص ميكند كه SQL Server Service
Broker بهطور خودكار
فعال خواهد كرد. گزينه EXECUTE AS
به شما اجازه ميدهد تا رويه فعال شدهاي را تحت يك زمينه كاربري متفاوت اجرا
كنيد.
پس از ايجاد صفها، ميتوانيد محتويات آنها
را با استفاده از عبارت SELECT
نمايش دهيد، درست مثل اين كه صف يك جدول پايگاه داده استاندارد باشد. اين خط كد
نحوه نمايش محتويات صف Request
را نشان ميدهد:
SELECT * FROM ResRequestQueue.
درست بعد از ايجاد صفها، آنها خالي
هستند. هرچند، اجراي عبارات SELECT
در صف، روش خوبي براي بررسي عملكرد برنامههاي SQL Server Service
Broker است كه مينويسيد.
بعد از ايجاد صفها، مرحله بعدي ايجاد يك
سرويس است. يك سرويس را با استفاده از عبارت CREATE SERVICE ايجاد كنيد. اولين پارامتر نام سرويس است. بخش ON QUEUE صف مربوط به سرويس را مشخص ميكند و سپس قراردادهايي كه مربوط به
سرويس هستند، ليست ميشوند.
اگر يكي از سرويسها در يك سيستم راهدور
قرار داشته باشد، همچنين بايد يك مسير ايجاد كنيد. عبارت CREATE ROUTE اصولاً SQL Server Service Broker
را با آدرس سيستمي مهيا ميكند كه سرويس راهدور پيدا شده است كه نحوه تحويل پيام
به سرويس راهدور را به SQL Server
ميگويد.
ارسال
پيامها به يك صف
بعد از ايجاد اشياي SQL Server Service
Broker ضروري، آماده
استفاده از آنها در برنامههاي صفبندي خود هستيد. ليست كد زير نشان ميدهد چگونه
ميتوانيد پيامي را به صف ResRequestQueue
اضافه كنيد:
DECLARE @ResRequestDialog UNIQUEIDENTIFIER BEGIN TRANSACTION BEGIN DIALOG @ResRequestDialog FROM SERVICE ResResponseService TO SERVICE 'ResRequestService' ON CONTRACT ResContract WITH LIFETIME = 1000; SEND ON CONVERSATION @ResRequestDialog MESSAGE TYPE ResRequest (N'My Request Message'); SEND ON CONVERSATION @ResRequestDialog MESSAGE TYPE ResRequest (N'My Request Message2'); COMMIT TRANSACTION
در ابتداي اين ليست، ميتوانيد ببينيد كه
متغيري به نام ResRequestDialog ايجاد شده است؛ اين متغير حاوي شناسه منحصر به فردي است كه توسط
گفتگوي SQL
Server Service Broker
نسبت داده خواهد شد. سپس، يك تراكنش شروع ميشود. در برگرفتن تمام اعمالي كه توسط SQL Server Service
Broker در يك تراكنش
انجام ميشوند، ايده خوبي است. اين امر به شما امكان ميدهد تا هر تغييراتي را براي
صفها commit يا roll back
كنيد. سپس، عبارت BEGIN
DIALOG براي باز كردن يك
گفتگوي SQL
Server Service Broker
جديد استفاده ميشود. هنگام معرفي يك گفتگو، هميشه بايد دو نقطه انتها را مشخص
كنيد. FROM
SERVICE آغازگر پيامها را
تعيين ميكند، در حالي كه كلمه كليدي TO SERVICE
نقطه انتهاي مقصد را تعيين ميكند. در اينجا، ارسال كننده ResResponseService و مقصد ResRequestService
ناميده ميشوند. در حالي كه اين مثال از نامهاي سادهاي استفاده ميكند،
مايكروسافت توصيه ميكند كه از يك نام URL
براي تعيين منحصر به فرد اشياي SQL Server Service Broker استفاده كنيد. مثلاً براي اطمينان از منحصر به فرد بودن در شبكه،
مايكروسافت پيشنهاد ميكند كه از چنين نامي استفاده كنيد:
[http://MyCompany.com/MyApp/ResResponseService]
كلمه كليدي ON CONTRACT قراردادي را مشخص ميكند كه براي گفتگو استفاده ميشود. اين
قرارداد مشخص ميكند كدام پيامها در اين گفتگو قادر به ارسال يا دريافت هستند.
سپس، دو عمل SEND اجرا ميشود. اين عبارات، دو پيام را به سرويس مقصد ارسال ميكنند
كه اين پيامها را دريافت خواهند كرد و آنها را به صفي اضافه ميكنند كه مربوط به
آن سرويس است. بالاخره تراكنش commit
ميشود.
بازيابي
پيامها از يك صف
حال كه نحوه افزودن پيام به صف را ديدهايد،
مثال بعدي نحوه ايجاد رويه ذخيره شدهاي را تشريح خواهد كرد كه پيامها را از صف
خواهند خواند. همانگونه كه ممكن است از مثالهاي ايجاد شئ SQL Server Service
Broker قبلي به خاطر
آوريد، صف مقصد، ResRequestQueue، با فعالسازي ايجاد شد. اين بدان معني است كه يك رويه ذخيره شده
مرتبط به نام ResRequestProc بهطور خودكار هنگام رسيدن پيام به صف شروع خواهد شد. ميتوانيد
كد اين رويه ذخيره شده را در اين ليست ببينيد:
CREATE PROC ResRequestProcASDECLARE @ResRequestDialog UNIQUEIDENTIFIERDECLARE @message_type_id intDECLARE @message_body NVARCHAR(1000)DECLARE @message NVARCHAR(1000) while(1=1)BEGIN BEGIN TRANSACTION WAITFOR (RECEIVE top(1) @message_type_id = message_type_id, @message_body = message_body, @ResRequestDialog = conversation_handle FROM ResRequestQueue), TIMEOUT 200; if (@@ROWCOUNT = 0) BEGIN COMMIT TRANSACTION BREAK END IF (@message_type_id = 2) -- End dialog message BEGIN PRINT ' Dialog ended ' + cast(@ResRequestDialog as nvarchar(40)) END ELSE BEGIN BEGIN TRANSACTION BEGIN DIALOG @ResRequestDialog FROM SERVICE ResRequestService TO SERVICE 'ResResponseService ON CONTRACT ResContract WITH LIFETIME = 1000; SELECT @message = 'Received:' + @message_body; SEND ON CONVERSATION @ResRequestDialog MESSAGE TYPE ResResponse (@message); PRINT CONVERT(varchar(30), @message) COMMIT TRANSACTION END CONVERSATION @ResRequestDialog END COMMIT TRANSACTIONEND
متغيري كه حاوي تعيين هويت گفتگوي پاسخ
خواهد بود، در بالاي اين رويه ذخيره شده معرفي ميشود و بعد از آن سه متغير ميآيد
كه براي اقتباس اطلاعات از صفي كه خوانده ميشود، استفاده خواهند شد. سپس حلقهاي
براي خواندن تمام وروديها از صف، مقداردهي اوليه ميشود. در اين حلقه، يك تراكنش
شروع شده و عبارت RECEIVE براي دريافت پيام استفاده ميشود. در اين مثال، بخش TOP(1) براي محدود كردن دريافت تنها يك پيام در يك زمان استفاده ميشود.
اگر بخش TOP حذف شود، ميتوانيد تمام پيامهايي را دريافت كنيد كه در صف ارايه
شدهاند. عبارت RECEIVE سه متغير را پر ميكند. message_type_id
نوع پيام را تعيين ميكند كه معمولاً يك پيام تعريف شده كاربر يا يك پيام End Dialog است. متغير @message_body حاوي محتويات پيام واقعي است، در حالي كه متغير @ResRequestDialog
حاوي هندلي است كه گفتگوي ارسال شونده را تعيين ميكند.
سپس، مجموعه نتيجه بررسي ميشود تا مطمئن
شويم كه پيام واقعاً دريافت شده است. اگر هيچ رديفي دريافت نشده باشد، آنگاه
آخرين تراكنش commit شده و رويه خاتمه مييابد. در غير اين صورت، چنانچه
رديفها بازيابي شده باشند، پيام typeid
بررسي ميشود تا مشخص شود آيا پيام يك پيام كاربر است يا يك پيام End Dialog. اگر يك پيام كاربر باشد، محتويات پردازش خواهند شد. ابتدا،
گفتگويي براي ResResponseService باز ميشود. اين گفتگو براي ارسال پيام اصلاح شده به صف ResResponse استفاده خواهد شد. مجدداً، ResContract مشخص ميشود كه انواع پيام مجاز را محدود ميكند.
بعد از باز شدن گفتگو، پيام دريافت شده
با الحاق رشته "Received:" با محتويات پيامي كه دريافت شده است اصلاح شده و سپس عبارت SEND براي ارسال پيام اصلاح شده به ResRequestQueue استفاده ميشود. بالاخره، مكالمه گفتگو خاتمه يافته و تراكنش commit ميشود.
SQL Server Service Broker تعدادي گزينه پيكربندي را فراهم كرده است كه نحوه عملكرد زيرسيستم
SQL Server
Service Broker را كنترل ميكند.
در اين بخش، نگاهي كوتاه به برخي از مهمترين گزينههاي پيكربندي خواهيم داشت.
مطالبي درباره امنيت SQL Server Service Broker
ميآموزيد و نگاهي به برخي از ديدگاههاي سيستم خواهيد داشت كه SQL Server 2005 فراهم كرده است تا به شما امكان گرفتن اطلاعاتي درباره برنامهها
و اشياي SQL
Server Service Broker
را خواهد داد.
چندين گزينه پيكربندي سيستم وجود دارند
كه ميتوانند با استفاده از رويه ذخيره شده سيستمي sp_configure براي تأثير بر رفتار زيرسيستم SQL Server Service
Broker تنظيم شوند. جدول
3-6 گزينههاي sp_configure موجود را براي SQL Server Service Broker فهرست كرده است.
|
شرح |
پارامتر
sp_configure |
|
پورت
مستمع broker
tcp |
پورتي
كه SQL
Server Service Broker
براي اتصالات شبكه استفاده ميكند. مقدار پيشفرض 4022 است. |
|
حالت
تعيين هويت broker
tcp |
نوعي
از تعيين هويت راهدور را تنظيم ميكند كه براي اتصالات استفاده خواهند شد.
مقدار 1 به معني عدم استفاده از تعيين هويت است. مقدار 2 بدين معني است كه از
تعيين هويت پشتيباني ميشود. مقدار 3 به معني نياز به تعيين هويت است. مقدار پيشفرض
3 است. |
|
حد
اندازه رو به جلوي broker |
حداكثر
فضاي ديسك را برحسب MB
براي ذخيره پيامهاي ارسال شونده تنظيم ميكند. مقدار پيشفرض 10 است. |
|
پيام
broker ارسال شونده |
نوع
پيام ارسال شونده مجاز را تنظيم ميكند. مقدار 1 به معني عدم مجاز بودن ارسال
است. مقدار 2 ارسال در حوزه را ميسر ميسازد. مقدار 3 ارسال خارجي را ميسر ميسازد.
مقدار پيشفرض 1 است. |
هنگامي كه گفتگوها ايجاد ميشوند، آنها
ميتوانند بهطور اختياري با استفاده از بخش WITH ENCRYPTION ايمن شوند. هنگامي كه گفتگويي با استفاده از بخش WITH ENCRYPTION ايجاد ميشود، يك كليد جلسه ايجاد ميگردد كه براي رمزگذاري پيامهاي
ارسال شده با استفاده از گفتگو به كار ميرود. يك نكته مهم درباره امنيت گفتگو اين
واقعيت است كه اين يك شكل امنيتي انتها به انتهاست. به عبارت ديگر، پيام هنگامي
رمزگذاري ميشود كه براي اولين بار از يك گفتگو ارسال شده باشد و تا وقتي كه پيام
به نقطه انتهايي خود نرسد، رمزگشايي نميشود. محتويات پيام هنگامي رمزگذاري ميشود
كه پيام در بين هر جهش مياني ارسال شود. براي پيادهسازي امنيت گفتگو، SQL Server Service
Broker از تعيين هويت
مبتني بر گواهينامه استفاده ميكند كه مدرك كاربر ارسال كننده به همراه پيام ارسال
ميشود. به دليل طبيعت غيرهمزمان SQL Server Service Broker، اطلاعات امنيتي در هدرهاي پيام ذخيره شده و هنگام بازيابي پيام،
توسط سرويس دريافت كننده بازيابي ميشوند. اين طراحي به برنامههاي SQL Server Service
Broker امكان ميدهد تا
از نياز به توليد اتصال براي پيامهاي تعيين هويت دوري كنند.
SQL Server 2005
چندين ديدگاه سيستمي را مهيا كرده است كه به شما امكان بازيابي اطلاعات درباره
اشياي SQL
Server Service Broker
و وضعيتهاي جاري آنها را ميدهد. جدول
4-6 ديدگاههاي كاتالوگ Service Broker را فهرست ميكند.
|
ديدگاه
سيستمي |
شرح |
|
sys.service_message_types |
تمام
انواع پيامهايي را كه ايجاد شدهاند، فهرست ميكند. انواع پيامهاي سيستم در
بالا ليست ميشوند، در حالي كه انواع پيامهاي تعريف شده كاربر در انتهاي نمايش
فهرست ميشود. |
|
sys.service_contracts |
تمام
قراردادهايي را فهرست ميكند كه ايجاد شدهاند. |
|
sys.service_contract_message_usages |
روابط
بين قراردادها و انواع پيام را فهرست ميكند. روابط ميتوانند يك به يك يا يك به
چند باشند. |
|
sys.services |
سرويسهاي
ايجاد شده را فهرست ميكند. |
|
sys.service_contract_usages |
روابط
بين قراردادها و سرويسها را فهرست ميكند. روابط ميتوانند يك به يك يا يك به
چند باشند. |
|
sys.service_instances |
سرويسهايي
را فهرست ميكند كه در زمان جاري فعال هستند. |
|
sys.conversation_endpoints |
نقاط
انتهايي مكالمه را كه هم اينك فعال هستند، فهرست ميكند. |
|
sys.routes |
مسيرهاي
ايجاد شده را فهرست ميكند. |
|
sys.remote_service_bindings |
روابط
سرويسها و كاربراني را فهرست ميكند كه سرويس را اجرا خواهند كرد. |
|
sys.transmission_queue |
تمام
پيامهايي را كه براي ارسال صفبندي شدهاند، فهرست ميكند. |
|
sys.service_queues |
صفهاي
ايجاد شده را فهرست ميكند. |