artarad_oracle_db

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

artarad_AQO_1

شکل ۲ نمای کلی صف‌بندی در معماری Point to Point را نمایش می‌دهد.

artarad_AQO_2

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;

1 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *