2012-02-21 9 views
10

私はサーバーのクラスタ上で実行されているWebサービスを持っています。このWebサービスは内部処理を行い、外部サービスに電話をかけて料金を払うことがあります。オプティミスティックキャッシング同時実行性の設計パターン

サービスに同じリクエストが送信された場合(保証されている場合)、処理を繰り返す必要はなく、処理時間/電力と発生するコストを節約できますサービスコールの外部部分に

しかし、私は私が

  • サービスは、高可用性とスケーラビリティのための複数のWebサーバ上で実行されている次の制約がある場合
  • 要求がかかることがあり、このキャッシュを管理する方法を見つけ出すのに苦労しています応答するのに5秒かかりますが、その間に私は2つまたは3つの他の同じ要求を受け取っているかもしれません。

分散環境で作業しているときに、最初のサービスコールが応答した(キャッシュ内で使用可能になる)まで、他のサービス呼び出しの実行を延期できますか。

私は、フロントプロキシパターンを入れて、プロキシ内に同じリクエストのキューを構築することを考えました。これにより、最初のリターン時に同じ応答を他のものに返すこともできます。これは正しいパターンですか、このシナリオを扱うより良い並行性パターンですか?

+0

外部のwsもクラスタ化されていますが、それを制御できますか?それは私のコントロールではない –

+0

その前にあなた自身のラッパーキャッシングWebサービスを書くことができる、良い目標を表すようだ。サプライヤから呼び出すサービスです – Codemwnci

+0

すべての_cache_シナリオと同じように:本当に、サービスは_ステートレスであると本当に確信していますか?私。中間の "ChangeCustomerName"がキャッシュを無効にしなければならないため、 "FetchCustomerDetailById"サービスはキャッシュできません。 –

答えて

6

あなたは可能性があり

  1. 結果はすでにこのハッシュのデータベースであり、そうであれば、
  2. 店にして、データベース内のハッシュをそれを返す場合
  3. 参照要求の暗号ハッシュを計算します結果保留状態
  4. Webサービスを呼び出し、結果をデータベースの行に更新します。ステップ2で

、ハッシュはすでに「結果保留中」の状態で、データベース内にある場合は、データベースごとにXミリ秒をポーリング可能性があり、最終的にはそれがあります一度結果を返します。

  • あなたは後続のすべての同一の要求に対してエラーを返します:あなたは場合にエラーが発生しないかを決定する必要があるため

    悪魔は、当然のことながら、細部に?

  • 待機中のスレッドがWebサービスの呼び出しを再試行しますか?
  • エラーを返すのはしばらくの間だけですか?その後再試行しますか?
+0

@downvoters:あなたのdownvotesを説明する気に? –

+0

私はまたdownvotesを理解したいと思います。 2つの投票(1つの鉱山)、2つのダウン、しかし説明がない? @ fyrの上にあなたの解決策について悪いことがありますか? – Codemwnci

+0

IIUC、fyrの解決策は、サーバごとに1つのキャッシュを持ち、単一障害点であるためにデータベースを持たないようにすることです。私はあなたが既に中央データベースを持っていると仮定しました。そこには99.9%のアプリケーションがあるからです。そこで私は、すべてのサーバーがこの中央データベースを永続キャッシュとして使用するソリューションを設計しました。 –

2

1)サービスは、単に設計制約としてこれを扱う高可用性とスケーラビリティ

のための複数のWebサーバ上で実行されています。これは、キャッシュルックアップメソッドにホスト名を組み込んでいないことを意味します。結果がホストに依存しない限り、問題はありません。 hostAが同じサービスと同じパラメータを持つHA環境でhostBと何か異なるものを返した場合、私はそれが設計上の欠陥であると考えます。

システムを冗長にしたい場合は、中央キャッシュを使用しないでください。ほとんどの場合、「中央」ソリューションは「単一障害点」と同義です。アプリケーションサーバー間で同期をとると、ロックがより複雑になります。

導入するキャッシュの数は、キャッシュヒット率とシステムで使用可能なリソースに少し依存しています。最も簡単な解決策は、サービスインスタンスごとのレベルでキャッシュすることです。

2.)リクエストには最大5秒かかることがありますが、その間に が2回または3回も同じリクエストを受け取っている可能性があります。

これは設計上の制約です。単純に2つの異なるステップでキャッシュを分割します。最初のスレッドが

また、必要に完成し、無料のロックを処理した後に値を挿入し、その値

  • に、キャッシング・ルーチンとロックのアクセスを入力した場合

    1. まず、あなたの同じ要求のためのキーを挿入例外処理を処理する。

      lockingconnectionメカニズムは異なる戦略

      • 同期で実装されるかもしれない - あなただけのミューテックス/セマフォまたは何をし、クリティカルセクションへのアクセスをロックします。これは、ロックがなくなるまで待機状態でいくつかのリクエストが発生する可能性があります。
      • 非同期 - スレッドがロックされたクリティカルセクションを満たしていれば、データが準備できていないというメッセージが表示される何らかのポーリングメカニズムを実装します(同期処理の場合と同様)。これにより多くのオープンな接続が生じることはありませんが、より複雑になります。 (あなたはあなたのサービスへのアクセスをシリアル化したくない限り)

    2. ミューテックス/セマフォまたは任意の構造、あなたは同じのために計算され、一意のキーに依存する場合がありますクリティカルセクション へのアクセスをロックするために使用します要求。

  • +0

    絶対に、すべてのホストは同じものを返します。それらは、HA /スケーラビリティのために異なるノードでのみ分割されます。しかし、それが生成する制約は、もはやシリアル・ドメインではなく、並列処理ドメインであるということです。したがって、ロック機構を使用するすべてのノードがアクセスできる中央キャッシュを提案しています – Codemwnci

    +0

    キャッシング・プロキシはロード・バランサの前にある必要があります。あなたがリクエストを通過させるならば、ノード上で待っているだけでなく、それを実行させるかもしれません。 –

    +0

    @Codemwnci私はこの質問に自分の投稿を調整しました。 – fyr

    関連する問題