ITPub博客

首页 > IT职业 > IT生活 > 08 Advance Queue

08 Advance Queue

IT生活 作者:东方友诚 时间:2015-10-15 11:04:48 0 删除 编辑
08 Oracle Advance Queue[@more@]

在client/server的环境中,请求是立即就要反应的。但是在很多情况下需要defer的情况。oracle的排队机制就是实现defer方式的工作的。

1、message的发展
1)使用文件系统作为queue的存储,其缺点是对象和事件分离。
2)用DB作为queue的存储,缺点是DB没有和消息管理的接口,它们依然是俩个独立的主体。
3)oracle使用消息系统,把消息管理合成在db中。

没有message的事务处理:
- 开发人员必须建立process之间的workflow。
- 需要异常处理系统来处理所有可能的错误。
- 需要复杂的错误处理程序来重新启动失败的进程。

有了message,则会:
- 在内核里面集成,减少开发逻辑
- 整个处理流程由系统纪录,包括异常和约束等
- OLTP和工作流无缝衔接

2、Message
Message就是单个事务处理工作的最小单位。Message包括:用户信息(以object type的形式)和控制信息(顺序、执行窗口、优先级等)。
一个事务transaction可以创建和处理多个message。
应用程序或者用户使用Enqueue过程给定用户信息和控制信息。
Message可以被其他应用(或者创建该message的应用)用DeQueue过程读取。
ENQUEUE和DEQUEUE应该是处理,而不是系统处理。

3、Message QUEUE.
一个Message QUEUE包括若干MESSAGE,一个MESSAGE只能属于一个QUEUE。
在创建QUEUE时给定名字,应用程序通过名字对MESSAGE QUEUE操作。
DBMS_AQADM包提供ALTER,ALTER,START,STOP和DROP QUEUE的操作。
DB中没有QUEUE个数的限制。

4、QUEUE TABLE
QUEUE TABLE是DB中普通的TABLE。可以定义任意数目的QUEUE TABLE,使用DBMS_AQADM中的过程来创建QUEUE TABLE.

5、ORACLE /AQ(Advanced Queue)的优点
可靠,和数据库合成一起,提高了性能和简化了操作。

6、ORACLE/AQ的特点
ORACLE AQ提供了
MESSAGE ORDER
MESSAGE PRIORITY
Correlation identifier
Time Constraints
Object Type as Message
Reply queue
exception queue
Nontransactional and transactional request
Mulitiple recipient
Message Grouping

7、DBMS_AQ包
只包含两个过程:ENQUEUE和DEQUEUE。
ENQUEUE:向QUEUE中加入MESSAGE。
DEQUEUE:从QUEUE中得到MESSAGE。
最开始只有SYS能使用DBMS_AQ包,其他用户必须有AQ_USER_ROLE role才能使用之。

8、DBMS_AQ.ENQUEUE
DBMS_AQ.ENQUEUE(
QUEUE_NAME IN VARCHAR2,
ENQUEUE_OPTIONS IN enqueue_option_t,
MESSAGE_PROPERTIES IN message_option_t,
PAYLOAD IN ,
MSGID OUT RAW)

ENQUEUE_OPTIONS和MESSAGE_PROPERTIES是预定义的RECORD类型。
PAYLOAD可以是OBJECT TYPE或者RAW。.OBJECT的属性最多可以有900个。为了存放RAW类型的PAYLOAD,AQ会建立一个包含LOB列的QUEUE TABLE。PAYLOAD最大有32K字节。

QUEUE_NAME由QUEUE_NAME和SCHEMA组成,简单的情况是只传QUEUE_NAME和PAYLOAD两个参数。不能是EXCEPTION QUEUE,只有系统才可以处理异常队列。

TYPE ENQUEUE_OPTIONS_T IS RECORD
(VISIBILITY BINARY_INTEGER default ON_COMMIT,
RELATIVE_MSGID RAW(16) DEFAULT NULL,
SEQUENCE_DEVIATION BINARY_INTEGER default NULL
);
VISIBILITY:指定处理请求的方式
ON_COMMIT:ENQUEUE是当前事务的一部分,当事务COMMIT的时候操作才结束。
IMMEDIATE:ENQUEUE不是事务的一部分,自己单独是一个事务。
RELATIVE_MSGID:是相关的MESSAGE ID,只有SEQUENCE_DEVIATION=BEFORE时才有效。如果SEQUENCE_DEVIATION没有设置,则这个参数就被忽略。
SEQUENCE_DEVICATION:指定message放入的位置
BEFORE:放在RELATIVE_MSGID的前面
TOP:放在所有message的前面
NULL:缺省

TYPE MESSAGE_PROPERTIES_T IS RECORD
(PRIORITY BINARY_INTEGER DEFAULTE 1,
DELAY BINARY_INTEGER DEFAULT NO_DELAY,
EXPIRATION BINARY_INTEGER deafult NEVER,
CORRELATION VARCHAR2(128) default NULL,
ATTEMPTS BINARY_INTEGER,
RECIPTIENT_LIST AQ$_RECIPIENT_LIST_T,
EXCEPTION_QUEUE VARCHAR2(51) default NULL,
ENQUEUE_TIME DATE,
STATE BINARY_INTEGER);

priority:优先级,越小级别越高,可以是任意值,包括负值。决定dequeue的顺序。

delay:以秒计,决定多长时间后可以dequeue。在delay期间,message是WAITTING状态,超过时间之后是READY状态。有建立MESSAGE来确定的,需要时间管理器启动。

expiration:以秒计,决定多长时间后message过期,从delay之后算起。=NEVER,永不过期。若设置值,表示处在READY状态多长时间。如果超过这个时间还没有DEQUEUE,则就移动到异常队列中,处于EXPIRED状态。

correlation:指定的相关的ID

attempts:试图从其中dequeue的次数,不能在ENQUEUE时候设置。

recipient_list:只有允许多个用户使用才有效。标示多个用户的信息。

expiration_queue:异常队列的名字。在两种情况下MESSAGE移动到其中:超过了QUEUE创建时候设置的最大重试次数或者到了EXPIRE TIME。其中的MESSAGE都是EXPORED状态。缺省的是QUEUE TABLE的异常队列。如果指定的异常队列不存在,就放到缺省队列中,在ALERT文件中有记录。当使用缺省队列,DEQUEUE就会返回NULL。

enqueue_time:message进入队列的时间,由系统决定。

state:4种状态:WAITTING, READY, PROCESSED, EXPIRED


RECIPIENT_LIST_T:
TYPE RECIPIENT_LIST_T IS TABLE OF SYS.AQ$AGENT INDEX BY BINARY_INTEGER;

TYPE SYS.AQ$AGENT IS OBJECT
(NAME VARCHAR2(30),
ADDRESS VARCHAR2(30),
PROTOCOL NUMBER)

MSGID
ENQUEUE完成后返回一个唯一的全局ID,用于随后的操作。

9、DBMS_AQ.DEQUEUE
DBMS_AQ.DEQUEUE(
queue_name IN VARCHAR2,
dequeue_options IN dequeue_options_t,
message_properties OUT message_properties_t,
payload OUT ,
msgid OUT RAW)

从queue中取message的条件取决于dequeue_options中consumer_name、msgid等参数。除非指定了msgid,只有READY状态的message才能dequeue。

TYPE DEQUEUE_OPTIONS_T IS RECORD
(consumer_name VARCHAR2(3) DEFAULT NULL,
dequeue_mode BINARY_INTEGER DEFAULT REMOVE,
navigation BINARY_INTEGER DEFAULT NEXT_MESSAGE,
visibility BINARY_INTEGER DEFAULT ON_COMMIT,
wait BINARY_INTEGER DEFAULT FOREVER,
msgid BINARY_INTEGER DEFAULT NULL,
cirrelation VARCHAR2(128) DEFAULT NULL);

dequeue_mode:
BROWSE:只是取MESSAGE,不加LOCK,相当于SELECT
LOCKED:加READ/WRITE LOCK,直到事务结束,相当于SELECT FOR UPDATE.
REMOVE:读取并UPDATE/DELETE该消息。

navigation:
决定从什么位置开始查询。
NEXT_MESSAGE:从下个开始。缺省值。
NEXT_TRANSACTION:从下一个transaction的第一个message开始。
FIRST_MESSAGE:从QUEUE的一个开始。

visibility:
决定是否属于当前transaction.,如果是BROWSE状态,忽略该值。
ON_COMMIT:属于当前transaction,缺省值
IMMEDIATE:自己作为一个TRANSACTION

WAIT:
决定如果没有符合条件的MESSAGE时,要等待多久。
FOREVER:等到有符合条件的出现,是缺省值
NO_WAIT:不等待。
number:等待的秒数

MESSAGE_PROPS_REC
(PRIORITY BINARY_INTEGER DEFAULT 1,
DELAY BINARY_INTEGER DEFAULT NO_DELAY,
EXPIRATION BINARY_INTEGER DEFAULT NEVER,
CORRELATION VARCHAR2(128) DEFAULT NULL,
ATTEMPTS BINARY_INTEGER,
RECIPIENT_LIST aq$_recipicent_list_t,
EXCEPTION_QUEUE VARCHAR2(51) DEFAULT NULL,
ENQUEUE_TIME DATE,
STATE BINARY_INTEGER);
用于传出该MESSAGE的信息。

10、AQ_TM_PROCESSES
如果MESSAGE需要DELAY、EXPIRE等,则需要有TIMER进程。在INIT文件中有AQ_TM_PROCESSES参数,设置=1,有一个时间管理器监控MESSAGE,目前只能设置为1。>1就会出错,且没有时间管理器产生。如果=0或者不设置则不启动时间管理。

11、DBMS_AQADM包和使用权限
该包有如下过程:
CREATE_QTABLE
DROP_QTABLE
CREATE_Q
DROP_Q
ALTER_Q
START_Q
STOP_Q
START_TIMEZ_MANAGER
STOP_TIMEZ_MANAGER
ADD_SUBSCRIBER
REMOVE_SUBSCRIBER
QUEUE_SUBSCRIBERS

错误的对消息管理则会造成系统性能问题。所以必须小心设置具有管理权限的人。最开始是只有SYS具有AQ_ADMINISTRATOR_ROLE。

12、GRANT_TYPE_ACCSES procedure
最开始由SYS用这个过程授权给其他用户处理AQ OBJECT TYPE的权限。如果用户想处理多个消费者队列的操作,必须先执行之授权,包括如下操作:CREATE_QUEUE_TABLE、CREATE_QUEUE,ADD_SUBSCROBER、REMOVE_SUBSCRIBER。

13、CREATE_QUEUE_TABLE
DBMS_AQADM.CRETAE_QUEUE_TABLE
(queue_table IN Varchar,
queue_payload_type IN varchar2,
storage_clause IN varchar2 default null,
sort_list IN varchar2 default null,
multiple_consumers IN BOOLEAN default NULL,
message_grouping IN binary_integer default NONE,
comment IN varchar2 default null,
auto_commit IN boolean TRUE);

用这个过程创建一个用于预定义类型的队列。如果需要对消息排序,创建队列时必须指定之。sort_list中放的是要用来排序的column或者排序对,用逗号分割,在dequeue时候用。
建立表的同时会建立下列相关的view和table。
缺省的exception queue table:aq$_<队列表名>_e
查询队列数据用的只读view:aq$<队列表名>
时间管理操作用的index:aq$_<队列表名>_T
为DEQUEUE操作在多消费者队列情况下使用的INDEX或者Indes Originized Table(IOT):aq$_<队列表名>_i

message_grouping:
DBMS_AQ.NONE,单独处理
DBMS_AQ.TRANSACTIONAL,和该事务的其他消息一起。

14、DROP_QUEUE_TABLE
DBMS_AQ.DROP_QUEUE_TABLE
(QUEUE_NAME
force IN BOOLEAN default FALSE,
auto_commit IN BOOLEAN default TRUE)

force
=FALSE: 如果有消息在队列,则失败
=TRUE:所有消息终止。

15、CREATE_QUEUE
CREATE_QUEUE
(queue_name,
queue_table IN VARCHAR2,
queue_type IN BINARY_INTEGER default NORMAL_QUEUE,
max_retries IN NUMBER default 0,
retyr_delay NUMBER default 0,
retention_time IN NUMBER 0,
dependency_tracking IN BOOLEAN default FALSE,
comment IN VARCHAR2 DEFAULT NULL,
auto_commit IN BOOLEAN DEFAULT TRUE)

一旦一个队列建立,需要用start_queue enable它,缺省是disable的。

queue_type= (NORMAL_QUEUE/ EXCEPTION_QUEUE)
max_retries=用remove方式dequeue的次数,当执行dequeue之后应用相当于做了rollback,这时加1。到了max_retries之后,消息移动倒异常队列中。
retry_delay=重试的间隔
rention_time=被从队列中删除后在queue table中保持的时间。
dependency_tracking =TRUE/FALSE,将来版本使用。

16、DROP_QUEUE
DBMS_AQADM.DROP_QUEUE
(QUEUE_NAME IN VARCHAR2,
AUTO_COMMIT IN BOOLEAN DEFAULT TRUE);

用于删除一个QUEUE。在删除之前必须STOP_QUEUE,限制enqueue和dequeue。


17、ALTER_QUEUE
DBMS_AQADM.ALTER_QUEUE
(QUEUE_NAME IN VARCHAR2,
MAX_RETRIES IN NUMBER DEFAULT NULL,
RETRY_DELAY IN NUMBER DEFAULT NULL,
RETRNTION_TIME IN NUMBER DEFAULT NULL,
AUTO_COMMIT IN BOOLEAN DEFAULT TRUE);

修改相关参数,如果设置为null,表示不修改原来的值。

18、START_QUEUE
DBMS_AQADM.START_QUEUE
(queue_name IN varchar2,
enqueue IN boolean default TRUE,
dequeue IN boolean default TRUE);

允许enqueue或者dequeue。CREATE_QUEUE之后必须用START_QUEUE激活之。

对异常队列只能用DEQUEUE,即使你两者都设置为true。

19、STOP_QUEUE
DBMS_AQADM.STOP_QUEUE
(queue_name IN varchar2,
enqueue IN boolean default TRUE,
dequeue IN boolean default TRUE,
wait IN boolean default TRUE);

wait:指定是否允许等待正在处理的事务的完成。在等待期间不允许enqueue和dequeue.

20、START_TIME_MANAGER / STOP_TIME_MANAGER
后台进程由init.ora中的参数aq_tm_process=1启动,在START_TIME_MANAGER 之后才能起作用,而且与事务无关。
STOP_TIME_MANAGER 停止执行,但是不中断后台进程。

21、ADD_SUBSCRIBER
DBMS_AQADM.ADD_SUBSCRIBER
(QUEUE_NAME IN VARCHAR2,
SUBSCRIBER IN SYS.AQ$_AGENT);

增加队列的subscriber。只有在多个消费者情况下才有作用,该操作立即起作用,当前的transaction同时commit。要有授权才可以使用这个过程。
TYPE SYS.AQ$_AGENT IS OBJECT
(NAME VARCHAR2(30),
ADDRESS VARCHAR2(30),
PROTOCOL NUMBER);


22、REMOVE_SUBSCRIBER
DBMS_QADM.REMOVE_SUBSCRIBER
(queue_nam IN varchar2,
subscriber IN SYS.AQ$_AGENT);

删除subscriber。,该操作立即起作用,当前的transaction同时commit。所以引用它的subscriber都删除掉。

23、QUEUE_SUBSCRIBER
QUEUE_SUBSCRIBER(queue_name IN varchar2) return AQ$_SUBSCRIBER;
返回AQ$_AGENT的PL/SQL TABLE,可以看到该QUEUE的所有SUBSCRIBER。


24、数据字典
DBA/USER_QUEUE_TABLES
DBA/USER_QUEUES
AQ$<队列表名>(是VIEW)

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30036720/viewspace-1814241/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-11-24

  • 博文量
    144
  • 访问量
    336919