Windows Azure 用に開発中の ASP.NET アプリがあります。アプリは書き込み負荷が非常に高いが、データは簡単に分離されるため、DB にシャーディングを使用して書き込み時間を改善する必要があると考えられています。ただし、すべてのインスタンスでいくつかの中心的な変数を追跡する必要があり、その情報を保存する最適な場所がわかりません。私のオプションは何ですか?
要件:
- 耐久性が必要で、インスタンスの再起動に耐えることができます
- 同期する必要があります。値を上書きしたり黙って失敗したりするのではなく、競合する更新を回避するか、少なくともそのような場合に例外をスローすることが非常に重要です。
- 適度に高速である必要があります (毎秒 2000 回以上の読み取り/書き込み)
単純にメモリ内の値を読み書きし、頻繁にディスクにフラッシュするワーカー ロールで実行する別のコンポーネントを作成することを考えましたが、その目的のために Windows で適切に使用できるものを既に作成しておく必要があると思います。アズール。
私が探しているのは Apache ZooKeeper のようなシステムだと思いますが、worker ロールの起動中に JRE をインストールする必要はありません。
編集: 以下の提案に基づいて、次のコードを使用して Azure Table Storage を使用しようとしています:
var context = table.ServiceClient.GetTableServiceContext();
var item = context.CreateQuery<OfferDataItemTableEntity>(table.Name)
.Where(x => x.PartitionKey == Name).FirstOrDefault();
if (item == null)
{
item = new OfferDataItemTableEntity(Name);
context.AddObject(table.Name, item);
}
if (item.Allocated < Quantity)
{
allocated = ++item.Allocated;
context.UpdateObject(item);
context.SaveChanges();
return true;
}
ただし、アイテムのコンテキストを最初に照会してコンテキスト追跡メカニズムに追加しないで、context.UpdateObject(item)
呼び出しは失敗しThe context is not currently tracking the entity.
ますか?