2014-04-11 26 views
2

我需要持續出隊來自Oracle隊列的消息。關於Oracle AQ出隊方法的建議

據我所知,我們可以通過兩種方式消除消息,無論是通過異步自動通知方法,還是通過手動輪詢過程,一次可以讓一條消息出隊。

我不能去異步通知功能,因爲它收到的消息的數量可能會在高峯時間5分鐘內達到1000和 我不想通過在後臺產生多個回調過程來重載數據庫。

通過手動輪詢過程,我可以創建一個運行24 * 7的一次性調度程序作業,調用一個存儲過程,在WAIT模式(偵聽消息的類型)中循環消息。 這種方法的問題在於:1)調度程序作業連續運行並佔用一個永久性作業槽 2)存儲過程因爲在等待消息的循環中運行而不會退出。

是否有任何替代/更好的解決方案,我不需要有一個工作/程序不斷尋找消息?

我可以使用自動通知方法獲取第一條消息的通知,取消訂閱訂閱者和進一步退出郵件,並且在沒有更多消息時再次訂閱隊列嗎?這是一個安全的方法,我會失去訂閱和取消訂閱之間的任何消息嗎? 順便說一句,我們使用Oracle 10gR2數據庫,所以我不能使用PURGE ON NOTIFICATION選項。

欣賞您的專家解決方案!

回答

3

你說得對,對大容量隊列使用自動通知不是一個好主意。

在一個客戶我已經看到它運行24 * 7的一次性調度工作,似乎工作相當不錯,他們可以排隊一個特殊的「STOP」消息(進入隊列的頂部)它偵聽並停止處理消息。

但是,通常我會傾向於定期運行的工作(例如,每分鐘一次,或適合您的任何粒度),從而將所有郵件出列。我會根據您在1分鐘內預計的最大消息數量,將出列列表放入循環計數器和「最大消息」限制器的循環中。該作業將繼續處理消息,直到(a)隊列中沒有更多消息,或(b)達到最大限制。

然後,您可以根據您希望在入隊和出隊之間看到的最大延遲來設置作業的計劃。例如。如果消息在5分鐘內未得到處理並不重要,則可以將該作業設置爲每5分鐘運行一次。

最大限制需要相當高的數字 - 例如10倍或100倍的預期最大數量 - 否則高峯可能會淹沒您的隊列,並且可能無法跟上。最大限度的想法是確保工作從不永遠運行。這應該給ops足夠的時間來檢測隊列中的問題(例如,如果某些流氓進程正在用僞造的消息淹沒隊列)。