对Oracle AQ出列方法的建议

时间:2014-04-11 04:48:38

标签: oracle oracle10g oracle-aq

我需要持续将来自Oracle Queue的消息出列。

据我所知,我们可以通过两种方式消除消息,通过异步自动通知方法或手动轮询过程,一次可以将一条消息出列。

我无法使用Asyncronous通知功能,因为它收到的邮件数量可能会在高峰时段内在5分钟内达到1000 我不想通过在后台生成多个回调过程来重载数据库。

通过手动轮询过程,我可以创建一个24 * 7运行的一次性调度程序作业,该作业调用存储过程,该过程在WAIT模式下循环消息(监听消息的类型)。 这种方法的问题在于 1)调度程序作业连续运行并占用一个永久作业槽 2)存储过程没有EXIT,因为它在等待消息的循环中运行。

是否有任何替代/更好的解决方案,我不需要让工作/程序持续运行以寻找消息?

我是否可以使用自动通知方法获取第一条消息的通知,取消订阅订阅者并将更多消息出列 没有更多消息时,再次订阅队列?这是一种安全的方法,我会在订阅和取消订阅之间丢失任何消息吗? 顺便说一句,我们使用Oracle 10gR2数据库,所以我不能使用PURGE ON NOTIFICATION选项。

感谢您的专家解决方案!!

1 个答案:

答案 0 :(得分:3)

你是对的,对高容量队列使用自动通知不是一个好主意。

在一个客户端,我看到一个24 * 7运行的一次性调度程序工作,它似乎工作得相当好,并且他们可以排队一个特殊的" STOP"消息(它位于队列的顶部),它侦听并停止处理消息。

但是,通常我会倾向于定期运行的工作(例如每分钟一次,或者适合您的任何粒度),这会使所有消息出列。我将dequeue放在一个循环中,循环计数器和一个"最大消息"限制器基于您在1分钟内所期望的最大消息数量。该作业将继续处理消息,直到(a)队列中没有更多消息,或(b)已达到最大限制。

然后,您可以根据要在enqueue和dequeue之间查看的最大延迟来设置作业的计划。例如。如果在5分钟内没有处理消息并不重要,您可以将作业设置为每5分钟运行一次。

最高限额需要很高 - 例如预期最大数量的10倍或100倍 - 否则峰值可能会淹没您的队列并且可能无法跟上。最大限制的想法是确保作业永远不会永远运行。这应该给ops足够的时间来检测队列的问题(例如,如果一些流氓进程充斥着伪造的消息)。