2011-06-28 5 views
2

WebサービスコールをColdFusionでどのように確実に実行する必要がありますか?ColdFusionでリモートWebサービスを確実に使用するベストプラクティスですか?

リモートサーバーがダウン/ビジーのような状況をどのように処理しますか?ページのタイムアウトにつながりますか?

x秒ごとに再試行する方法は?

リモート呼び出しを非同期で呼び出す必要がありますか?その場合は、コールバックを行う方法は?

多分、ColdFusion 10 <cfjob>とClosureサポートはこれらを清潔でより単純な方法で扱います。しかし、CF9でこれをどう対処するのですか?

あなたは

+0

他のサーバー上の外部リソースへのREST呼び出しのような意味ですか? –

+0

@Ciaranはい、あらゆるスタイルのWebサービス、RESTまたはSOAP。 – Henry

答えて

2

我々は通常、RESTやSOAP、またはActiveMQの上で第三者との統合の多くを行うありがとうございます。

一般的に、同じ方法ですべてのWebサービスコールを処理します。タイムアウトやその他のエラーによって失敗した場合は、cfhttp属性をthrowOnError=trueに設定して例外をスローします。これは電子メールや開発チームが調査できるように、高度なアプリケーション例外処理によって捕捉されます。

このアプローチの唯一の例外は、プレゼンテーションデータを取得するなど、重要ではないCFMページから「簡単な」Webサービスを呼び出す場合です。このページでは、ページ全体を呼び出すためにタイムアウトしたくないので、throwOnError=false(デフォルト)を設定し、エラーのステータスメッセージ/コードをチェックします。調査チームはエラーを開発チームにメールでお送りしますが、ページ処理を続行します。

私たちはほとんどのサービスがすぐに別のリクエストによって再び呼び出されることを知っているので、再試行は避けがちですが、どこで線を引いていますか? 1回再試行? 100回の再試行?これはユーザーにどのような影響を及ぼしますか?私はまた、リトライについてのロジックが、たいていはおかしなことになり、通常は醜く繰り返していることがわかります。

結果がプレゼンテーションページで使用されるWebサービスの別のアプローチは、スケジュールされたタスクまたはcfthreadから呼び出すことです。これは、キャッシュ、データベースなどに結果を保持し、Webサービス自体ではなく永続ストアにデータをロードするコードを取得するとよいアプローチです。これには、ページが高速であること(Webサービスコールが遅れている場合)と、エラーがユーザーに影響を与えないことを確認するという2つの効果があります。再度、調査のために何らかの不具合が報告されます。

タイムアウトが長すぎたため、忙しいプレゼンテーションページのWebサービスが表示されました(私は最大1〜3秒程度を目指しています)。実行中のすべてのリクエストは、Webサービスを処理して使用された後、キューイングが開始されました。綺麗ではない。その間違いから学び、非常に速いタイムアウトを使用するか、または私が前に述べたようにWebサービスをそこに置かないでください。

私は非同期コール/コールバックを行うことはできません。 Node.jsを考えているかもしれません:)

+0

私はキューを実装しようと考えています。各タスクは結果を格納し、失敗した場合は再試行を行います。しかし、あなたの答えを読んだ後、再試行が本当に必要なものなら、私は考え直すべきです...ありがとう! – Henry

+0

ちょっと研究しましたが、理論的にはActiveMQ pub/subを非同期呼び出し/コールバックとして使用できませんか? – Henry

+0

私たちはActiveMQだけを消費してきましたが、理論的にはサービスごとにトピックを作成してメッセージをプッシュしてメッセージを消費する可能性があります。 ActiveMQは通常、一部のコンシューマーにブロードキャストするために使用されるため、コンシューマーが1つだけであることを確認する必要があります。 –

関連する問題