2

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

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

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

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

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

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

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

4

1 回答 1

3

没错,对大容量队列使用自动通知并不是一个好主意。

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

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

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

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

于 2014-04-11T05:35:11.763 回答