2016-07-29 12 views
5

私のシステムでは、一連のマイクロサービスを使用してアイテムを処理しています。アイテムの最新の状態を保持するステートフルなMicroServiceを作成する予定です。そのサービスでは、すべての項目の状態を信頼できる辞書に格納し、項目にアクセスするたびにその項目の「最後にアクセスした項目」を更新する予定です。サービスファブリックのキャッシュとしての信頼性の高いコレクションキャッシング

私は、信頼性の高いコレクションに最近使用したアイテムのみを保存し、長時間アクセスしていないアイテムを空色のテーブルストレージ のような外部ストレージに移動する必要があります。信頼性の高いコレクションは同期している必要があります。

すべてのアイテムは外部ストレージに保管され、最近使用されたアイテムは信頼できるコレクションにある必要があります。

これは、信頼性の高い収集におけるオーバーヘッドを減らすためです。

信頼できるコレクションはキャッシュとして機能します。

上記のように私のソリューションを実装するのがベストプラクティスですか? ReliableCollectionを列挙することをお勧めしますか?

答えて

3

信頼できるディクショナリがキャッシュとして機能することを意図している場合は、未使用のアイテムをAzure Storageにオフロードするという点は実際にはありません。それがキャッシュであれば、未使用のアイテムはパージされると予想され、呼び出し元はキャッシュから期限切れになったものについて真実のソースに戻る必要があります。しかし、それは信頼できる辞書が最新の真実の源であることを望むように思えます。だから、実際にキャッシュを構築しているのか、データをメモリから取り除くことができる真理データストアのソースを最初に決定しなければならないと思います。後者のように聞こえます。

どちらの場合も、記述したとおりに実行できますが、信頼できるディクショナリと外部ストア間でトランザクションを持たないため、一貫して同期を維持することは容易ではありません。

コレクションを列挙しても問題ありませんが、高価な操作なので、ユーザー要求パスなどのホットパスで大量のデータを処理することはお勧めしません。定期的に定期的に行うのは大丈夫です。

外部ストレージにデータをオフロードする必要がありますか?ローカルディスクにオフロードできますか?信頼できるコレクションはすぐに状態をディスクに自動的にオフロードします。

+0

私はReliableコレクションからデータをオフロードする必要があります。ローカルディスクへのオフロードが利用可能なら、それは素晴らしいことでしょう....ありがとう。 –

+2

進行中です。最新のリリース(5.1)では、データは常にメモリとディスクに格納されています。将来のリリースでは、ホットデータのみがメモリに格納され、すべてのデータはディスク上に残ります。 –

+0

私はそれを楽しみにしています - どのくらいのものが記憶にあるか見る方法はありますか? –

0

私は俳優を使用します。各項目に自分の俳優を与え、そこに州を格納します。アクタがガベージコレクションされると、他の場所に状態を保存したり、単にアクタタイマーで状態を保存したりすることができます。

これは、多くのインスタンスを管理するために多くのアクターコードを複製する必要がないことを意味します。

CAVEAT

あなたの全体的なデザインが意味をなす場合、これは理にかなっています。以下のVaclavのコメントによれば、アクターのためのシングルスレッドモデルのため、アクターは汎用キャッシュには適していません。しかし、デザインに単一のエンティティを表すアクターがあり、キャッシュがそのエンティティー(ユーザーなど)に関連している場合、アクターをキャッシュとして扱うとうまくいく可能性があります。

+3

アクターインスタンスごとにシングルスレッドアクセスが適用されるため、通常アクターはキャッシュには適していません。つまり、複数のリーダーが同時に同じデータにアクセスすることはできず、スループットが低下します。 –

+0

素晴らしい点!キャッシュのユーザーは、アクターがパーティション化されているのと同じ方法でパーティション化されているかどうかの注意点があると思います。 –

+2

これは、アクターインスタンスが1人のユーザーを表し、クライアントインスタンスとアクターインスタンスが1:1にマッピングされている場合など、並行読み込みがない特殊なケースで動作します。しかし、汎用キャッシュとして、それは良い考えではありません。 –

関連する問題