2010-11-26 4 views
4

私はサードパーティのフィードからデータを読み込み、少し修正して保存してから、クライアントに返すためにWebサービスに取り組んでいます。定期的に第三者サイトからの更新が必要です。 AzureのWebロールでWCFサービスとして実行されます。まずCでWebサービスキャッシュを構築する方法#

は、私はちょうどいつも私parsefeedメソッドへの呼び出しを行いますが、最後の更新が早す​​ぎた場合はそのコールのリターンを作るだろうと思った...

public void ParseFeed() 
    { 
     if (DateTime.Now > lastrun.AddMinutes(1)) 
     { 
     //Fetch updated data into something shared here. 
     //thedata is a public static in Global class 
     thedata = fetchdata(); 
     lastrun=DateTime.Now;    
     } 
    } 

しかし、私は推測フェッチとしてできること一度に複数のユーザーがそのコードにヒットする1-2秒(そのWebサービス)を利用します。 http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607 から

アプリケーションクラスを含む任意のクラスの静的メンバは、スレッドセーフではないので、ユーザコードは、静的メンバにアクセスするための適切なロックを提供しなければなりません。これは、アプリケーションクラスに追加する静的メンバーに適用されます。情報の多くはhere

  • 私は静的VARを回避し、キャッシュを使用し、その中に自分のデータを入れることができます(それは希望:

    • 私は(わからない方法)ロックEDITを使用することができます有効期限が切れると複数のユーザーがデータを取得しようとします)

    • 偽のデータ項目を持つキャッシュ(基本的にはタイマー)を使用して有効期限が切れると更新できますが、サイトに当たっていた。

    • 出力キャッシュを使用することは実際にはできません。クライアントは、各リクエストを一意にする方法でクライアントに返すデータを照会するからです。要求に応じてサービスの並べ替えとフィルタリングを行います。

    私は、Azureの複数のインスタンスで結果の一貫性について心配していません。それぞれは自分自身を取得することができるので、複数のサーバーに状態を共有する必要はありません。

    シンプルな解決策があると感じました。私は完全に逃しました。アイデア?

    +0

    ロックを管理する方法を示したhttp://stackoverflow.com/questions/39112/what-is-the-best-way-to-lock-cache-in-asp-net#40065を見つけました。これはほとんどのオプションに当てはまることがありますが、キャッシュや静的な変数を使用するかどうか、あるいはより簡単なメカニズムがあるかどうかという疑問が残っています – Andiih

    答えて

    1

    、のように見える:2つのサービスインスタンスが回をリフレッシュするため、さまざまなデータを返す場合、それが許容される日付

  • の外分以上のデータを提供するために受け入れられない

    • 同期
    • から外れたデータが、これらはすべて真であると仮定すると、

  • リフレッシュされる間、発信者が1〜2秒間遮断することは許容され、その後、最も簡単な解決策はただであります静的変数を使用してデータを格納し、チェック/リフレッシュ・ブロック全体に lock構成を使用します。私はダブルチェックロックパターンのような巧妙なことをしようとするのは気にしないでしょう。重要な領域で費やされる時間がブロックされているにもかかわらず、誰もがブロックしなければならない場合を除いて、Webサービスを操作するオーバーヘッドに比べて重要ではないため、ロックの競合は問題にならないでしょう。

    +0

    データが一杯になったらすなわち、古くなったデータを処理している間、バックグラウンドのノンブロッキングリフレッシュを開始する方が良いでしょう。一方、データが1時間(期限切れ)と言っていた場合は、フェッチを取り消して返す必要があります。 – Andiih

    +0

    これは私が行ったルートですが、フェッチ中にブロックされた多数のユーザーが存在する可能性があるため、ロック再チェックを実装しましたが、それ以外の場合はフェッチを試みます。 – Andiih

    1

    あなたはおそらくあなたが書いている以上にキャッシュから読んでいるので、私はReaderWriterLockSlimを使って、同時に複数のスレッドがデータを読み書きできるようにします。また、キャッシュされたデータは、コンシューマによって変更されていないことを確認するために不変であることを確認します。あなたの質問から

    関連する問題