2011-06-28 24 views
2

應該如何可靠地在ColdFusion中執行Web服務調用?在ColdFusion中可靠地使用遠程Web服務的最佳實踐?

您如何處理遠程服務器宕機/忙碌等情況?並導致頁面超時?

如何實施每x秒重試?

是否應該以異步方式調用遠程調用,如果是,如何進行回調?

也許ColdFusion 10 <cfjob>和Closure支持將以更清晰,更直接的方式解決這些問題。但是,如何在CF9中解決這些問題?

謝謝

+0

你的意思是像REST調用另一臺服務器上的外部資源? –

+0

@Ciaran是的,任何風格的Web服務,REST或SOAP。 – Henry

回答

2

我們做了很多與第三方的整合通常在REST或SOAP,或ActiveMQ的。

通常我們會以同樣的方式處理所有Web服務調用 - 如果它們失敗(通過超時或其他錯誤),我們會通過設置cfhttp屬性來拋出異常。這受到高級應用程序異常處理的影響,因此他們可以調查哪些電子郵件或開發團隊。

這種方法的唯一例外是從CFM頁面調用一個不重要的'平凡'web服務 - 例如獲取一些演示數據。我們不希望在這次調用中暫停整個頁面,所以我們設置throwOnError=false(默認值)並檢查錯誤的狀態消息/代碼。我們將錯誤發送給開發團隊進行調查,但我們只是繼續進行頁面處理。

我們傾向於避免重試,因爲我們知道大多數服務會很快被另一個請求再次調用,並且您在哪裏畫線? 1重試? 100次重試?這如何影響用戶?我也發現關於重試的邏輯最多可能是混亂的,通常是醜陋和重複的。

在演示文稿頁面上使用結果的Web服務的另一種方法是從計劃任務或cfthread調用它們。如果您可以將結果保存在緩存,數據庫或其他方面,並讓您的代碼訪問數據的持久性存儲而不是Web服務本身,則這是一種很好的方法。這具有確保頁面快速(如果您的Web服務調用延遲)並且任何錯誤不會影響用戶的雙重效果。任何失敗都可以報告進行調查。

我們已經看到一個繁忙的演示文稿頁面上的Web服務由於超時時間過長而導致服務器關閉(我的目標時間大概爲1-3秒)。所有運行的請求都用完了,然後開始排隊。不漂亮。從這個錯誤中學習,並使用非常快的超時,否則就不要像前面提到的那樣把Web服務放在那裏。

我不相信有可能做異步調用/回調。你可能會想到Node.js :)

+0

我正在考慮實現一個隊列,每個任務都會存儲結果,並在失敗時負責重試。然而,在閱讀您的答案後,我應該重新考慮重試是否真的是我需要的東西......謝謝! – Henry

+0

剛剛做了更多的研究,我們不能在理論上使用ActiveMQ pub/sub作爲異步調用/回調嗎? – Henry

+0

我們只使用ActiveMQ,但我想在理論上,您可以爲每個服務或某個東西提供一個主題,並推送消息並使用消息。 ActiveMQ通常用於向一些消費者廣播,因此您需要確保只有一個消費者等。 –