【问题标题】:Suggestion for Oracle AQ dequeue approachOracle AQ dequeue 方法的建议
【发布时间】:2014-05-25 02:02:19
【问题描述】:

我需要将来自 Oracle 队列的消息连续出列。

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

我不能使用异步通知功能,因为它在高峰时段收到的消息数量可能会在 5 分钟内达到 1000 条,并且 我不想通过在后台产生多个回调过程来使数据库过载。

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

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

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

感谢您的专家解决方案!

【问题讨论】:

    标签: oracle oracle10g oracle-aq


    【解决方案1】:

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

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

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

    然后,您可以根据您希望在入队和出队之间看到的最大延迟来设置作业计划。例如。如果消息在 5 分钟内未处理,则可以将作业设置为每 5 分钟运行一次。

    上限需要相当高的数字 - 例如预期最大数量的 10 倍或 100 倍 - 否则峰值可能会淹没您的队列,并且可能无法跟上。最大限制的想法是确保作业永远不会运行。这应该给操作员足够的时间来检测队列的问题(例如,如果某些流氓进程正在用虚假消息淹没队列)。

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 2016-05-04
      • 2013-03-17
      相关资源
      最近更新 更多