Advanced Queuing in Oracle
Advanced Queuing in Oracle
در این مستند مبانی ابتدایی صفبندی پیشرفته در نگارش ۹i و بالاتر پایگاهداده اوراکل مورد بررسی اجمالی قرار میگیرد. صفبندی پیشرفته سازوکار اصلی و پیشفرض اوراکل برای پیامرسانی میباشد. این سازوکار در نسخههای مختلف در حال توسعه است و یک API برای پیامرسانی درون پایگاهداده و یا از پایگاهداده به خارج فراهم میکند. برای مثال میتوان از این سازوکار برای پیامرسانی بین پایگاهداده اوراکل و صفهای JMS استفاده کرد. AQ از سازوکار Asynchronous پشتیبانی میکند؛ بنابراین گیرنده میتواند پیام را بعدا دریافت نماید.
دیگر امکانات این سازوکار حفظ ، پیگیری ، مستندسازی، وابستهسازی و جستوجو در پیامهای درون صفها میباشد. این سازوکار برای اولین بار در نگارش ۸i معرفی گردید. در نگارش ۹٫۲ بدون پرداخت هزینه اضافی همراه با نسخههای استاندارد و تجاری نصب میشد. سپس در نگارش ۱۰٫۱ با محصول Oracle Streams اجین شد و Oracle Streams AQ نامیده شد.
AQ در فناوری Data Guard نیز مورد استفاده قرار میگیرد. در این معماری پردازشهای ناظر صف (qmn0) پایگاههای دادهای که نقش Primary دارند، با سازوکار AQ ارتباط برقرار میکنند. سازوکار AQ از پایگاهداده اوراکل بهعنوان مخزن برای Asynchronous queuing استفاده میکند. همچنین از AQ به عنوان سرویس پیامرسان داخلی جاوا در Oracle Enterprise Service Bus استفاده میشود. این سازوکار قابلیت استفاده درون توابع SQL را نیز دارد.
به فرآیند قرار دادن یک پیام درون صف enqueue و برداشتن یک پیام از درون صف dequeue گفته میشود. پیام میتواند برای چند مخاطب قابل برداشت باشد؛ اما تنها یکبار و از طریق یک مخاطب میتواند dequeue شود. همچنین مخاطبین میتوانند بدون برداشتن پیام، صف و محتوای پیام را مرور کنند.
AQ دو معماری زیر را برای پیامرسانی پشتیبانیمیکند.
۱٫ Point to Point
۲٫ Publish / Subscribe
شکل ۱ نمای کلی صفبندی در معماری Publish/Subscribe را نمایش میدهد.
شکل ۲ نمای کلی صفبندی در معماری Point to Point را نمایش میدهد.
AQ برای پیامرسانی بین پایگاههای داده و نرمافزارهای مختلف بر روی سرورهای گوناگون از Oracle Net Services، HTTP(S) و SMTP پشتیبانی میکند. از آنجا که AQ از جداول پایگاهداده استفاده میکند، تمامی ویژگیهای دسترسیپذیری بالا ، مقیاسپذیری و اطمینانپذیری برای پیامهای درون صفها صدق میکند. همچنین ویژگیهای استاندارد پایگاهداده نظیر بازیابی، راهاندازی مجدد و امنیت در AQ پشتیبانی میشود و جدولهای صف قابل Export و Import میباشند.
۲ برپاسازی محیط
مدیریت و دسترسی مجوزها برای صفبندی پیشرفته از طریق دو نقش زیر امکانپذیر است.
۱٫ AQ_ADMINISTRATOR_ROLE
با استفاده از این نقش کاربر میتواند زیرساخت صفبندی را ایجاد و مدیریت نماید.
۲٫ AQ_USER_ROLE
با استفاده از این نقش کاربر میتواند عملیات enqueue و dequeue را انجام دهد.
۲-۱ کاربریها و دسترسیها
در این مستند از دو کاربری استفاده شده است. کاربری نخست مالک زیرساخت صفبندی بوده و کاربری دیگر صرفاً دارای دسترسی enqueue و dequeue میباشد. برای ایجاد این دو کاربری دستور زیر از طریق کاربری sys اجرا میشود.
SQL> CREATE USER aq_admin IDENTIFIED BY aq_admin;
User created.
SQL> GRANT CONNECT TO aq_admin;
Grant succeeded.
SQL> GRANT CREATE TYPE TO aq_admin;
Grant succeeded.
SQL> GRANT AQ_ADMINISTRATOR_ROLE TO aq_admin;
Grant succeeded.
SQL> ALTER USER aq_admin QUOTA UNLIMITED ON users;
User altered.
SQL> CREATE USER aq_user IDENTIFIED BY aq_user;
User created.
SQL> GRANT CONNECT TO aq_user;
Grant succeeded.
SQL> GRANT AQ_USER_ROLE TO aq_user;
Grant succeeded.
SQL>
۲-۲ تعریف Type
محتویات و یا متن پیامها با نام Payload شناخته میشوند. این محتویات میتوانند در ساختارها و قالبهای گوناگونی وجود داشته باشند. برای مثال میتوانند از گونه XML ، ANYDATA و یا User Defined باشند. برای ارسال پیام با ساختار دلخواه لازم است ابتدا گونه آن درون پایگاهداده تعریف شود. همچنین لازم است دسترسی اجرا نیز به کاربری aq_user اعطا شود. دستور زیر توسط کاربری aq_admin برای انجام این امور اجرا میشود.
SQL> CREATE OR REPLACE TYPE event_msg_type AS OBJECT
(
name VARCHAR2 (10),
current_status NUMBER (5),
next_status NUMBER (5)
);
/
Type created.
SQL> GRANT EXECUTE ON event_msg_type TO aq_user;
Grant succeeded.
۲-۳ ایجاد صف و جدول مربوطه
پس از تعریف گونه مربوطه حال میتوان اقدام به ایجاد زیرساخت لازم برای پیامرسانی کرد. با اجرای دستور زیر توسط کاربری aq_admin صف و جدول مربوط به آن ایجاد و سپس صف آغاز میشود. از این جدول برای ذخیرهسازی پیامها تا زمان dequeue استفاده میشود.
SQL> EXECUTE DBMS_AQADM.create_queue_table ( –
queue_table => ‘aq_admin.event_queue_tab’, –
queue_payload_type => ‘aq_admin.event_msg_type’);
PL/SQL procedure successfully completed.
SQL> EXECUTE DBMS_AQADM.create_queue ( –
queue_name => ‘aq_admin.event_queue’, –
queue_table => ‘aq_admin.event_queue_tab’);
PL/SQL procedure successfully completed.
SQL> EXECUTE DBMS_AQADM.start_queue ( –
queue_name => ‘aq_admin.event_queue’, –
enqueue => TRUE);
PL/SQL procedure successfully completed.
برای احراز ایجاد صف از دستور زیر توسط کاربری SYS استفاده میشود. این دستور کلیه اشیا کاربری AQ_ADMIN را نمایش میدهد.
SQL> SELECT object_name, object_type
FROM dba_objects
WHERE object_name != ‘DEMO_QUEUE_PAYLOAD_TYPE’ AND OWNER = ‘AQ_ADMIN’;
۲-۴ ایجاد دسترسی
پس از ایجاد صف لازم است دسترسیهای لازم به کاربر یا کاربرانی که از آن استفاده میکنند اعطا شود. برای این منظور از دستور زیر درون کاربری مالک یا همان aq_admin استفاده میشود.
SQL> EXECUTE DBMS_AQADM.grant_queue_privilege ( –
privilege => ‘ALL’, –
queue_name => ‘aq_admin.event_queue’, –
grantee => ‘aq_user’, –
grant_option => FALSE);
PL/SQL procedure successfully completed.
در این مرحله کاربری aq_user مجوزهای لازم عملیات enqueue و dequeue را دارا میباشد.
۲-۵ ارسال پیام
ارسال پیام به درون صف از طریق DBMS_AQ.ENQUEUE قابل انجام است. با استفاده از بلوک PL/SQL زیر یک پیام آزمایشی درون صف قرار داده میشود. این پیام از طریق کاربری aq_user ارسال میشود.
SQL> DECLARE
l_enqueue_options DBMS_AQ.ENQUEUE_OPTIONS_T;
l_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
l_message_handle RAW (16);
l_event_msg AQ_ADMIN.event_msg_type;
BEGIN
l_event_msg := AQ_ADMIN.event_msg_type (‘REPORTER’, 1, 2);
DBMS_AQ.enqueue (queue_name => ‘aq_admin.event_queue’,
enqueue_options => l_enqueue_options,
message_properties => l_message_properties,
payload => l_event_msg,
msgid => l_message_handle);
COMMIT;
END;
/
PL/SQL procedure successfully completed.
برای بررسی صحت ارسال پیام میتواند با استفاده از دستور زیر محتویات جدول EVENT_QUEUE_TAB را بررسی نمود.
SQL> SELECT enq_uid FROM AQ_ADMIN.EVENT_QUEUE_TAB;
ENQ_UID
——————————
AQ_USER
۱ row selected.
۲-۶ مرور پیامهای صف
دستور زیر تعداد پیامهای درون صف را نمایش میدهد.
SQL> SELECT COUNT (*) FROM AQ_ADMIN.EVENT_QUEUE_TAB;
COUNT(*)
———-
۱
۱ row selected.
از دستور زیر نیز برای مرور پیام بدون انجام فرآیند dequeue استفاده میشود.
SQL> SELECT USER_DATA FROM AQ_ADMIN.EVENT_QUEUE_TAB;
۲-۷ خواندن پیام
برای خواندن پیام از درون صف از DBMS_AQ.DEQUEUE استفاده میشود. دستور زیر پیامی که در مرحله پیش درون صف قرار داده شد را dequeue میکند.
SQL> DECLARE
l_dequeue_options DBMS_AQ.DEQUEUE_OPTIONS_T;
l_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
l_message_handle RAW (16);
l_event_msg AQ_ADMIN.event_msg_type;
BEGIN
DBMS_AQ.dequeue (queue_name => ‘aq_admin.event_queue’,
dequeue_options => l_dequeue_options,
message_properties => l_message_properties,
payload => l_event_msg,
msgid => l_message_handle);
DBMS_OUTPUT.put_line (‘Event Name : ‘ || l_event_msg.name);
DBMS_OUTPUT.put_line (
‘Event Current Status: ‘ || l_event_msg.current_status);
DBMS_OUTPUT.put_line (‘Event Next Status : ‘ || l_event_msg.next_status);
COMMIT;
END;
/
Event Name : REPORTER
Event Current Status: 1
Event Next Status : 2
PL/SQL procedure successfully completed.
همانطور که پیشتر اشاره شد، عملیات dequeue تنها یک بار قابل اجرا میباشد. از این رو سطر متناظر آن در جدول AQ_ADMIN.EVENT_QUEUE_TAB دیگر وجود نخواهد داشت. برای احراز این موضوع از دستور زیر استفاده میشود.
SQL> SELECT * FROM AQ_ADMIN.EVENT_QUEUE_TAB;
اقا لینک مطلبو من پیدا نکردم.میشه راهنماییم کنید؟