فصل ششم

 

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 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 با سيستم رزرواسيون واقعي محاوره خواهد كرد كه به‌طور طبيعي روي سيستم ديگري اجرا مي‌شود.

 

شكل 1-6 طراحي برنامه صف‌بندي شده

 

به دليل اين كه برنامه‌هايي نظير اين‌ها بايد از هزاران كاربر هم‌زمان پشتيباني كنند، آن‌ها نمي‌توانند قفل رديف‌ها را فراهم كنند، در حالي كه يك كاربر معين منتظر مي‌ماند تا در مورد جزييات نهايي يك پرواز تصميم‌گيري كند يا حتي يك رزرواسيون را شروع كند و سپس اجرا شود و براي خاتمه برنامه‌ريزي كند. قفل‌گذاري رديفي در اين نوع روش، به‌طور جدي مانع از مقياس‌پذيري و حتي قابليت استفاده برنامه مي‌شود. صف‌بندي اين مشكل را با دادن امكان انجام يك درخواست غيرهم‌زمان براي يك رزرواسيون برطرف مي‌كند و درخواستي را به سيستم رزرواسيون back-end ارسال كرده و بلافاصله براي كار ديگر آزاد مي‌شود. در هيچ جايي از فرآيند تعيين رزرواسيون، هيچ قفلي روي جداول پايگاه داده نداريم. سيستم رزرواسيون back-end كه لزوماً در حالت دسته‌اي كار مي‌كند، درخواست رزرواسيون را خارج از صف خواهد گرفت و سپس بهنگام‌رساني پايگاه داده را انجام مي‌دهد. با توجه به اين كه بهنگام‌رساني در حالت دسته‌اي و بدون محاوره كاربر انجام مي‌شود و سريعاً اتفاق مي‌افتد و حداقل زمان براي قفل كردن رديف‌ها مورد نياز است، در حالي كه بهنگام‌رساني انجام مي‌شود. اگر درخواست موفق باشد، رزرواسيون كاربر نهايي تأييد مي‌شود. در غير اين صورت، اگر درخواستي به اين دليل پذيرفته نشود كه تمام صندلي‌ها رزرو شده‌اند و يا به دلايل ديگر، آن‌گاه رزرواسيون پذيرفته نخواهد شد و كاربر از اين وضعيت مطلع مي‌شود.

گفتگوها

گفتگوها يك جزء ضروري SQL Server Service Broker جديد مايكروسافت هستند. لزوماً، گفتگوها[1] پيام‌رساني دو روشه را بين دو نقطه انتهايي فراهم مي‌كنند. نقاط انتهايي براي اين پيام‌ها مي‌توانند دو برنامه‌اي باشند كه روي نمونه‌ها يا سرورهاي متفاوتي اجرا مي‌شوند يا مي‌توانند دو برنامه‌اي باشند كه روي يك سرور اجرا مي‌شوند. شكل 2-6 گفتگوي SQL Server Service Broker را نشان مي‌دهد.

 

شكل 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 را نشان مي‌دهد.

 

شكل 3-6 گروه مكالمه SQL Server Service Broker

 

هدف اصلي تحت گروه مكالمه، فراهم كردن يك مكانيزيم قفل‌گذاري براي صف‌هاي مرتبط است. در اين صحنه، مهم درك اين نكته است كه قفل‌گذاري بر هر جدول پايگاه داده مرتبط اعمال نمي‌شود. در عوض، قفل‌گذاري كه توسط گروه مكالمه ميسر مي‌شود، بر موجوديت‌هايي در صف‌ها اعمال مي‌شود. در مورد يك سفارش، اين امر ممكن است بدين معني باشد كه هيچ فرآيندي نمي‌تواند براي هر يك از صف‌ها در گروه مكالمه شما، سفارشات را بخواند، در حالي كه برنامه شما قفلي را روي اين ورودي‌ها گذاشته است.

علاوه بر قفل‌گذاري، گروه مكالمه به برنامه امكان نگهداري حالت را نيز مي‌دهد. نگهداري حالت هميشه يكي از مشكل‌ترين جنبه‌هاي يك برنامه غيرهم‌زمان بوده است، زيرا مي‌تواند باعث تأخيرهاي طولاني بين رسيدن پيام‌ها شود. باز نگه داشتن رشته‌هاي فعال در طي آن دوره زماني يك راه‌حل نيست، زيرا تمام رشته‌هاي بي‌استفاده، منابع سيستم را به شدت مصرف مي‌كنند و مقياس‌پذيري را پايين مي‌آورند. در عوض، گروه مكالمه حالت يك موجوديت را با استفاده از يك جدول حالت نگهداري مي‌كند. گروه مكالمه از يك ID نمونه (يك GUID) به عنوان كليد اصلي براي تعيين ورودي‌ها در گروه صف‌ها استفاده مي‌كند.

 

فعال‌سازي SQL Server Service Broker

فعال‌سازي 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 مجموعه‌اي از فوق داده را براي توصيف انواع پيام‌هايي كه يك برنامه مي‌تواند دريافت كند به كار مي‌برد كه جهت‌هاي ارسال و نحوه ارتباط پيام‌ها هستند. لزوماً، فوق داده SQL Server Service Broker شالوده پيام‌رساني مورد استفاده برنامه را توصيف مي‌كند. علاوه بر اين، اين فوق داده داراي مجوزهاي مرتبطي است كه مي‌توانند براي ايمن ساختن برنامه پيام‌رساني استفاده شوند. شكل 4-6 مدل فوق داده 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 دريافت مي‌شوند.

 

DDL و T-SQL DML

T-SQL با چندين عبارت جديد كه يكپارچگي طبيعي پيام‌رساني SQL Server Service Broker را با رويه‌هاي پايگاه داده متداول ممكن مي‌سازند، بهبود يافته است. جدول 1-6 عبارات DDL جديد T-SQL را خلاصه كرده است كه براي ايجاد اشياي SQL Server Service Broker استفاده مي‌شوند.

 

جدول 1-6 عبارات 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 جديد را فهرست كرده است.

جدول 2-6 عبارات T-SQL براي پيام‌هاي 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

در اولين قسمت اين بخش، مرور سطح بالايي از نحوه استفاده از SQL Server Service Broker براي نوشتن برنامه‌هاي پيام‌رساني غيرهم‌زمان داشتيد. اين بخش هم‌اكنون به تشريح عمقي‌تر نحوه استفاده از T-SQL براي ايجاد اشياي SQL Server Service Broker مورد نياز مي‌پردازد و نحوه استفاده از آن‌ها را در يك برنامه ساده نشان مي‌دهد. برنامه نمونه يك سيستم رزرواسيون ساده است كه يك درخواست رزرواسيون ساده را در يك صف ورودي پذيرفته و آن‌گاه به پيامي در يك صف پاسخ، جواب مي‌دهد.

 

ايجاد اشياي SQL Server Service Broker

كدي كه براي ايجاد اشياي SQL Server Service Broker مورد نياز استفاده مي‌شود، در اين ليست نشان داده شده است:

 

CREATE MESSAGE TYPE ResRequest
       ENCODING varbinary
CREATE 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 ResRequestProc
AS
DECLARE @ResRequestDialog UNIQUEIDENTIFIER
DECLARE @message_type_id int
DECLARE @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 TRANSACTION
END

 

 

متغيري كه حاوي تعيين هويت گفتگوي پاسخ خواهد بود، در بالاي اين رويه ذخيره شده معرفي مي‌شود و بعد از آن سه متغير مي‌آيد كه براي اقتباس اطلاعات از صفي كه خوانده مي‌شود، استفاده خواهند شد. سپس حلقه‌اي براي خواندن تمام ورودي‌ها از صف، مقداردهي اوليه مي‌شود. در اين حلقه، يك تراكنش شروع شده و عبارت RECEIVE براي دريافت پيام استفاده مي‌شود. در اين مثال، بخش TOP(1) براي محدود كردن دريافت تنها يك پيام در يك زمان استفاده مي‌شود. اگر بخش TOP حذف شود، مي‌توانيد تمام پيام‌هايي را دريافت كنيد كه در صف ارايه شده‌اند. عبارت RECEIVE سه متغير را پر مي‌كند. message_type_id نوع پيام را تعيين مي‌كند كه معمولاً يك پيام تعريف شده كاربر يا يك پيام End Dialog است. متغير @message_body حاوي محتويات پيام واقعي است، در حالي كه متغير @ResRequestDialog حاوي هندلي است كه گفتگوي ارسال شونده را تعيين مي‌كند.

سپس، مجموعه نتيجه بررسي مي‌شود تا مطمئن شويم كه پيام واقعاً دريافت شده است. اگر هيچ رديفي دريافت نشده باشد، آن‌گاه آخرين تراكنش commit شده و رويه خاتمه مي‌يابد. در غير اين صورت، چنان‌چه رديف‌ها بازيابي شده باشند، پيام typeid بررسي مي‌شود تا مشخص شود آيا پيام يك پيام كاربر است يا يك پيام End Dialog. اگر يك پيام كاربر باشد، محتويات پردازش خواهند شد. ابتدا، گفتگويي براي ResResponseService باز مي‌شود. اين گفتگو براي ارسال پيام اصلاح شده به صف ResResponse استفاده خواهد شد. مجدداً، ResContract مشخص مي‌شود كه انواع پيام مجاز را محدود مي‌كند.

بعد از باز شدن گفتگو، پيام دريافت شده با الحاق رشته "Received:" با محتويات پيامي كه دريافت شده است اصلاح شده و سپس عبارت SEND براي ارسال پيام اصلاح شده به ResRequestQueue استفاده مي‌شود. بالاخره، مكالمه گفتگو خاتمه يافته و تراكنش commit مي‌شود.

 

راهبري Service Broker

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 فهرست كرده است.

 

 

 

جدول 3-6 گزينه‌هايي براي sp_configure

شرح

پارامتر 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 را فهرست مي‌كند.

 

جدول 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

صف‌هاي ايجاد شده را فهرست مي‌كند.

 



[1]- Dialogs

[2]- Conversation Group

[3]- Windows Management Instrumentation

[4]- Message Type

[5]- Contract

[6]- Service