2010-02-10 43 views
4

這是一個關於應用程序接收消息,將它們保存到數據庫以及可能發送消息的常見情況的最佳實踐問題。何時關閉隊列/數據庫失敗時的消息處理?

  • 假定事務性排序出原子提交;什麼時候完全關閉應用程序是一個很好的策略?
  • 如果數據庫失敗,應用程序可能會被消息充斥,最終會拒絕。它應該立即放棄嗎?
  • 如果出站消息傳遞服務失敗,數據庫將被回滾充斥。再次,最好立即放棄嗎?

對於如何在這種情況下如何最好地強制關閉彈簧應用程序的任何提示,作爲默認偵聽器包含的更多布朗尼分將捕獲任何運行時異常並繼續運行。

回答

1

從我瞭解你正在尋找以下:

  1. 不要從入站隊列中的消息鬆動只是因爲應用程序無法處理它們。
  2. 何時在處理過程中發生錯誤時停止處理。

首先,分析您正在處理的基礎架構以及您需要處理的情況非常重要。典型的停機時間以及它們在系統的各個層次中出現的頻率。如何可靠是網絡,是你dB的RAC服務器等

  1. JMS已經爲重試機制。如果消息處理失敗,請將其發送回隊列,直到退役失效。這隻有在加上延遲的情況下才有意義,這樣纔不會發生洪泛。如果一個小的延遲不會影響交易,我會推薦使用延遲的消息。取決於您的JMS提供程序,這是容器自定義的支持。來自入站隊列的消息無法處理時,使用死信或異常隊列可以幫助丟失消息。

  2. 再一次,你可以成爲情況的最佳評判者。您可以將一個屬性定義爲多少個連續發送到死信隊列構成關閉條件。您可以在系統測試期間對其進行調整,以避免誤報。

+0

謝謝你的回答!我並不擔心第1點 - 在我的設置中插入數據庫和確認消息已經是事務性的(並且重複提交檢測也在那裏)。我真的希望收集關於如何處理第2點的意見,即其他人做了什麼。 – xcut 2010-02-14 18:46:44

+0

死信隊列對我來說非常有趣,我想了解更多關於它的信息。 Cracked_all,你如何調整這個設置?你能詳細說明一下嗎? – paradisonoir 2010-02-15 19:21:19

+0

@xcut在我正在開發的當前生產系統中,我們的MaxDeliveryCnt爲10,延遲時間爲10秒。爲了給出一個觀點,這是一個遍佈全球的24x7系統,每天處理2K-3K獨特交易的三層結構。 – 2010-02-16 13:24:31

1

由於cracked_all也提到了,所以不建議立即放棄。

我認爲最好的辦法是讓其他數據庫準備好作爲主要的失敗。收到不成功的確認後,您可以將它們路由到第二個確認。因此,你不會失去那麼多的數據。對於這種情況,您可以在JMS中使用「Guaranteed Delivery」功能。

憑藉Guaranteed Delivery,消息傳遞系統使用內置的數據存儲來保存消息。每個安裝消息傳遞系統的計算機都有自己的數據存儲,以便可以將消息存儲在本地。發件人發送郵件時,發送操作無法成功完成,直到郵件安全地存儲在發件人的數據存儲中。隨後,消息不會從一個數據存儲區中刪除,直到它成功轉發並存儲到下一個數據存儲區。這樣,一旦發送方成功發送消息,它就會始終存儲在至少一臺計算機的磁盤上,直到成功發送給接收方並由其確認。 1

+0

謝謝你的回答,一票贊成。我非常有興趣聽到人們使用的不同政策。我對持久交付等沒有問題(問題中的消息傳遞系統已經是事務處理,並且使用JTA進行出站消息傳遞,這也需要更新數據庫)。 – xcut 2010-02-14 18:44:54

+0

在這種情況下,我認爲你的狀態非常好。 – paradisonoir 2010-02-15 19:18:10

相關問題