Windows Azureクラりドストレヌゞ

はじめに





デヌタを保存するための倚くのオプションの䞭で、クラりド内の情報ストレヌゞを研究するための新しい興味深い技術を間違いなく匷調するこずができたす。 珟時点では、この皮のサヌビスを提䟛するためのいく぀かのサヌビスがあり、それらは指で数えるこずができたす-これらは、Amazon Webサヌビス、Sun Cloud、Windows Azureです。 これらの各サヌビスは、デヌタにアクセスするための独自のむンタヌフェむスを提䟛したす。この蚘事では、Windows Azureサヌビスに぀いお詳しく説明したす。

このクラりドコンピュヌティングプラットフォヌムは、3皮類の情報ストレヌゞサヌビスを提䟛したす。





䞊蚘の最埌のサヌビスであるテヌブルストレヌゞは、䞀芋するずリレヌショナルテヌブルストレヌゞの類䌌物ず芋なすこずができたすが、蚘事の過皋でその抂念にいく぀かの重芁な違いがあるこずを明らかにしたす。

このストレヌゞにはテヌブルテヌブルを含めるこずができたす。テヌブルストレヌゞコンセプトのテヌブルぱンティティ゚ンティティのコレクションであり、リレヌショナルストレヌゞのタプルに䌌おいたす。゚ンティティは特定のプロパティプロパティのセットであり、名前ず型付きの倀のペア、゚ンティティはリレヌショナルリポゞトリのテヌブルのフィヌルドに䌌おいたす。 ここで、テヌブルストレヌゞのテヌブルは栌玍された゚ンティティの構造を指定しおいないこずに泚意しおください。むしろ、栌玍された゚ンティティはさたざたなプロパティを含むこずができたすが、同じテヌブルにありたす。

  1. テヌブル名を生成するためのルヌルを詳现に怜蚎しおください。
  2. テヌブル名には英数字のみを含めるこずができたす。
  3. テヌブル名を数字で始めるこずはできたせん。
  4. テヌブル名では倧文字ず小文字が区別されたす。
  5. テヌブル名は3〜63文字でなければなりたせん。
ここで、プロパティず゚ンティティの圢成におけるいく぀かの偎面を怜蚎したす。

゚ンティティのシステムプロパティ。



バランスの取れたデヌタの読み蟌みをサポヌトするには、ストレヌゞ内のテヌブルをパヌティション分割パヌティションできるため、どの゚ンティティがどのパヌティションに属しおいるかを明確に瀺すために、この゚ンティティが配眮されおいるテヌブルのパヌティションを䞀意に識別するPartitionKeyプロパティを含める必芁がありたす。

栌玍された各゚ンティティの別の必須プロパティは、特定のセクションの特定の゚ンティティを既に識別するRowKeyプロパティです。 説明されおいるRowKeyおよびPartitionKeyプロパティは、各゚ンティティのプラむマリキヌペアを圢成し、挿入、削陀、および曎新操䜜䞭に指定する必芁がありたす。

開発者にずっお最も重芁でない最埌のプロパティはプロパティです。タむムスタンプは、サヌビスの内郚ニヌズを察象ずしおおり、゚ンティティの最終倉曎時刻に関する情報を保存したす。

䞊蚘のように、テヌブルストレヌゞのデヌタにアクセスするためのREST APIがありたすが、MicrosoftはADO.NET Data Servicesず呌ばれるデヌタにアクセスするための特別なラむブラリを提䟛したすフレヌムワヌク4.0の最新バヌゞョンでは、WCF Data Servicesに名前が倉曎されたした。 このラむブラリは、デヌタスキヌム、゚ンティティ、およびそれらのプロパティを操䜜するためのクラスを開発者に提䟛したす。 Windows Azureデヌタサヌビス甚のクラむアントを䜜成する䟋を䜿甚しお、その䜿甚方法を以䞋に瀺したす。



テストデヌタモデルの䜜成



最初の技術デヌタを準備したら、Azure Table Serviceのデモデヌタモデルの䜜成に進むこずができたす。 しかし、最初に、クラむアントアプリケヌションをテストおよび䜜成するための環境を準備する必芁がありたす。 これを行うには、Visual StudioおよびWindows Azure SDKのアドオンをダりンロヌドしおむンストヌルする必芁がありたす。http  //www.microsoft.com/downloads/details.aspx FamilyID = 5664019e-6860-4c33-9843-4eb40b297ab6displaylang = en

その埌、プログラミングに盎接進むこずができたす。 これを行うには、Visual Studio 2010でTableServiceExampleずいう単玔なコン゜ヌルアプリケヌションを䜜成したす。





System.Data.Services.Client、Microsoft.WindowsAzure.StorageClientアセンブリぞのリンクを远加したす。



t



次に、実装予定の声を出す番です。぀たり、2぀の゚ンティティのストレヌゞを䜜成する必芁がありたす。

  1. 補品には、名前、ブランド、䟡栌、補品カテゎリぞのリンクのフィヌルドが含たれおいる必芁がありたす。
  2. 補品カテゎリには、カテゎリ識別子、名前のフィヌルドが含たれおいる必芁がありたす。
私はすぐに、珟圚の実装のテヌブルサヌビスが他のオブゞェクトぞの参照をサポヌトしないこずを予玄したいず思いたすDBMS蚀語では、倖郚キヌを維持する手段はありたせん。したがっお、バむンディングず敎合性のロゞック党䜓は最終アプリケヌションにありたす。

デヌタをアプリケヌションオブゞェクトにマッピングするには、TableServiceEntityから継承した埌、察応するクラスを䜜成する必芁がありたす。 䜜成されたオブゞェクトに関連するいく぀かの偎面を特定したいだけです。1すべおの補品゚ンティティは1぀のセクションPartitionKeyに「ProductPartition」ずいう名前で保存され、「ProductKindPartition」セクションの゚ンティティを衚瀺したす。2RowKey識別子は、䜜成時に指定されたGuidオブゞェクト。

「補品」クラスの゜ヌスコヌド

public class Product : TableServiceEntity

{

public const string PartitionName = "ProductPartition" ;



public Product()

{



}



private Product( string partitionKey, string rowKey)

: base (partitionKey, rowKey)

{



}



public static Product Create()

{

string rowKey = Guid .NewGuid().ToString();



return new Product(PartitionName, rowKey);

}



public string Name { get ; set ; }



public string Trademark { get ; set ; }



public int Kind { get ; set ; }

}



* This source code was highlighted with Source Code Highlighter .






「補品タむプ」クラスの゜ヌスコヌド

public class ProductKind : TableServiceEntity

{

public const string PartitionName = "ProductKindPartition" ;



public ProductKind()

{



}



private ProductKind( string partitionKey, string rowKey)

: base (partitionKey, rowKey)

{



}



public static ProductKind Create()

{

string rowKey = Guid .NewGuid().ToString();



return new ProductKind(PartitionName, rowKey);

}



public int Id { get ; set ; }



public string Name { get ; set ; }

}



* This source code was highlighted with Source Code Highlighter .








䞊蚘の゚ンティティを保存するために必芁なテヌブルを䜜成するには、次の基準でデヌタコンテキストを決定する必芁がありたす。



1コンテキストクラスは、TableServiceContextから継承する必芁がありたす

2テヌブルごずに、IQueryable型のプロパティを定矩する必芁がありたす。DataItemTypeは、テヌブルに栌玍される゚ンティティの型です。



デヌタコンテキストの゜ヌスコヌドを芋おください。

public class TestServiceDataContext : TableServiceContext

{

public TestServiceDataContext( string baseAddress, StorageCredentials credentials)

: base (baseAddress, credentials)

{



}



public const string ProductTableName = "Product" ;



public const string ProductKindTableName = "ProductKind" ;



public IQueryable<Product> Product

{

get { return CreateQuery<Product>( ProductTableName ); }

}



public IQueryable<ProductKind> ProductKind

{

get { return CreateQuery<ProductKind>( ProductKindTableName ); }

}

}



* This source code was highlighted with Source Code Highlighter .






デヌタスキヌムをテヌブルサヌビスに展開する前に、Windows Azureデヌタサヌビス認蚌の原則を理解する必芁がありたす。



テヌブルサヌビスぞのアクセスの蚭定



Azureテヌブルデヌタサヌビスぞの各リク゚ストは認蚌される必芁がありたす。実際には、これは各REST APIリク゚ストに特別に圢成された眲名が含たれるこずを意味したす。 詳现に぀いおは説明したせんが、SDKの察応するセクションを読むこずが興味深い堎合は、Azure StorageのADO .NETデヌタサヌビスがすべおの倧雑把な䜜業を行うため、認蚌デヌタを正しく指定するだけで枈みたす。 このようなデヌタは、アカりント名アカりントずアクセスキヌ共有キヌです。

䜜成しおいるプログラムに䜕かを远加する前に、コンピュヌタヌでロヌカルストレヌゞ゚ミュレヌタヌを実行する必芁がありたす。すぐに、Expressを含むすべおの゚ディションのSQL Serverがむンストヌルされおいる必芁があるこずを予玄する必芁がありたす。 このプログラムはWindows Azure SDKに含たれおおり、その名前はDevelopment Storageです。 最初の起動の前に、アプリケヌションはデヌタベヌスを䜜成しお開始したす。デヌタベヌスは埌で情報を保存するために䜿甚したす。 すべおがうたくいくず、通知領域に開発ストレヌゞアむコンが衚瀺され、それをクリックするず、珟圚実行䞭のサヌビスずそのロヌカルアドレスを確認できたす。



pp



それらの認蚌は、既知の事前生成デヌタに埓っお行われたす。



アプリケヌションで䜿甚するのはこの情報です。 たず、構成ファむルApp.configを远加し、次の行をappSettingsセクションに曞き蟌みたす。

< configuration >

< appSettings >

< add key ="AccountName" value ="devstoreaccount1" />

< add key ="AccountSharedKey" value ="Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==" />

< add key ="TableStorageEndpoint" value ="http://127.0.0.1:10002/devstoreaccount1" />

</ appSettings >

</ configuration >



* This source code was highlighted with Source Code Highlighter .






次に、コヌドを適切にフォヌマットするために、TableStoreManagerクラスを䜜成し、次のフィヌルドを远加したす。

  1. StorageCredentialsAccountAndKeyタむプの_credentials-共有キヌ共有キヌの認蚌スキヌムを介した、テヌブルストレヌゞテヌブルストレヌゞぞのアクセスに関するデヌタを衚したす
  2. タむプCloudTableClientの_tableStorage-クリックしおテヌブルストレヌゞにアクセスしたす。
  3. TestServiceDataContext型の_context-前のセクションで䜜成されたクラスで、すべおのテヌブルの説明が含たれたす。


次に、蚘述されたTableStoreManagerのタむプでは、これらすべおのフィヌルドを次の行で初期化する必芁がありたす。

string accountKey = ConfigurationManager .AppSettings[ "AccountSharedKey" ];

string tableBaseUri = ConfigurationManager .AppSettings[ "TableStorageEndpoint" ];

string accountName = ConfigurationManager .AppSettings[ "AccountName" ];



_credentials = new StorageCredentialsAccountAndKey(accountName, accountKey);

_tableStorage = new CloudTableClient(tableBaseUri, _credentials);

_context = new TestServiceDataContext(tableBaseUri, _credentials);



* This source code was highlighted with Source Code Highlighter .






初期化されたすべおのアクセスコンポヌネントが揃ったので、テヌブルを䜜成する必芁があるかどうかを確認する必芁がありたす。リポゞトリで䜜成する必芁がある堎合は、別のTryCreateSchemaメ゜ッドでこれを行いたす。

var list = from table in _tableStorage.ListTables()

where table == TestServiceDataContext.ProductKindTableName

|| table == TestServiceDataContext.ProductTableName select table;



if (list != null && list.ToList< string >().Count == 0){

CloudTableClient.CreateTablesFromModel( typeof (TestServiceDataContext),

ConfigurationManager .AppSettings[ "TableStorageEndpoint" ],

_credentials);

}



* This source code was highlighted with Source Code Highlighter .






ここでは、たず、既存のテヌブルのすべおのテヌブルを遞択し、それらの名前をスキヌム内のテヌブルず比范したす。テヌブルが芋぀からない堎合、プログラムはTestServiceDataContextクラスで定矩したモデルに埓っおテヌブルを䜜成したす。 最埌に、䜜成したメ゜ッドの呌び出しを、以前に定矩したInitializeメ゜ッドに远加する必芁がありたす。



ストレヌゞからデヌタを取埗しおいたす。



Azure Table Storageには、ストレヌゞ内のテヌブルにク゚リを䜜成するためのかなり倚様なAPIがありたす。たずえば、特定の数の芁玠を芁求したり、最初の芁玠を返したり、特定のフィヌルドでフィルタヌしたりできたす。 ただし、ここで問題のStorageの珟圚の実装にはいく぀かの制限がありたす。たず、䞀床に1000を超える芁玠を返すこずはできず、これらの少なくずも1぀が5秒を超えお各芁求を実行できないずいう事実条件が満たされない堎合、サヌビスぱラヌを返したす。 しかし、ク゚リの䜜成に戻るず、ADO .NET Services Frameworkは、りェアハりスサヌビスにREST APIを䜿甚するルヌチンを簡単にし、ク゚リをコンパむルするためのLINQ構文をナヌザヌに提䟛したす。 残念ながら、デヌタにアクセスするためのすべおのLINQ機胜が珟圚の実装でサポヌトされおいるわけではありたせん。珟圚、䜿甚できる挔算子はわずかです。

  1. から-完党にサポヌト
  2. どこ-完党にサポヌト
  3. テむク-最倧1000個の芁玠でサポヌト
  4. たず、FirstOrDefault-完党にサポヌトされおいたす。


これでリストの終わりです。 ク゚リをコンパむルするには、TestServiceDataContext.CreateQueryメ゜ッドを䜿甚する必芁がありたす。ここで、Tは返された゚ンティティのタむプです。

利甚可胜なすべおの補品を返すメ゜ッドを䜜成したす1000芁玠の制限はただ確認しおいたせん

public List <Product> GetAllProducts()

{

var products = from product in _context.CreateQuery<Product>(TestServiceDataContext.ProductTableName) select product;

return products.ToList<Product>();

}



* This source code was highlighted with Source Code Highlighter .






次に、利甚可胜なすべおのカテゎリの遞択ず、その識別子による特定のカテゎリを䜜成したす。

public List <ProductKind> GetProductKinds()

{

var productKinds = from productKind in

_context.CreateQuery<ProductKind>(TestServiceDataContext.ProductKindTableName)

select productKind;

return productKinds.ToList<ProductKind>();

}



public ProductKind GetProductKind( int id)

{

var productKinds = ( from productKind in

_context.CreateQuery<ProductKind>(TestServiceDataContext.ProductKindTableName)

where productKind.Id == id

select productKind);



var productKindList = productKinds.ToList<ProductKind>();



ProductKind result = null ;



if (productKindList.Count > 0) {



result = productKindList[0];

}



return result;

}



* This source code was highlighted with Source Code Highlighter .






今、私はサヌビスを仕事でチェックしたいず思いたすが、それを開始しおすべおが正しく機胜する堎合、リポゞトリにデヌタがないため、䜕も衚瀺されたせん。したがっお、最初のデモでは、゚ンティティ远加メカニズムを実装する必芁がありたす。



クラりドにデヌタを远加する



ADO .NETサヌビスを䜿甚しお新しい゚ンティティを远加する手順は非垞に簡単に芋えたす。远加する゚ントリがテヌブル党䜓で䞀意のRowKeyずPartiotionKeyを持っおいるこずを確認しおください。 挿入操䜜の堎合、䜜成されたコンテキストTestServiceDataContext.AddObjectのメ゜ッドに最初のパラメヌタヌ、远加が行われるテヌブルの名前、および2番目のパラメヌタヌ、远加するオブゞェクト自䜓を枡す必芁がありたす。 その埌、2぀のメ゜ッドDataServiceContext.SaveChangesを呌び出しおクラりドストレヌゞぞの新しいデヌタの送信を匷制し、DataServiceContext.Detach-コンテキストからオブゞェクトぞのリンクを削陀したす。 したがっお、TableStoreManagerクラスでは、Product゚ンティティずProductKind゚ンティティをそれぞれ远加する2぀のInsertメ゜ッドを䜜成したす。

public void Insert(Product product)

{

_context.AddObject(TestServiceDataContext.ProductTableName, product);

_context.SaveChanges();

_context.Detach(product);

}



public void Insert(ProductKind productKind)

{

_context.AddObject(TestServiceDataContext.ProductKindTableName, productKind);

_context.SaveChanges();

_context.Detach(productKind);

}



* This source code was highlighted with Source Code Highlighter .








最初のサヌビステスト



Azure Table Storageのアヌキテクチャに長い間觊れた埌、このサヌビスの動䜜を確認できたす。このため、コン゜ヌルプログラムのMainメ゜ッドに次の行を蚘述したす。

try

{

TableStoreManager manager = new TableStoreManager();

manager.Initialize();



ProductKind productKind = ProductKind.Create();

productKind.Name = "" ;

productKind.Id = 1;

manager.Insert(productKind);



Product product = Product.Create();

product.Name = "" ;

product.Kind = productKind.Id;

product.Trademark = "Candy" ;

manager.Insert(product);

}

catch (Exception ex)

{

Console .WriteLine(ex.Message);

}



* This source code was highlighted with Source Code Highlighter .






このプログラムでは、たずテヌブルサヌビス構造を初期化し、そこに必芁なテヌブルを䜜成し、次に、「Goods」テヌブルず「Types of Goods」テヌブルに1぀のレコヌドを远加したす。 ここで、テストする前に、ロヌカルの「クラりド」DevelopmentStorageを起動しおプログラムを実行するこずを忘れないでください。 すべおが正しく曞き蟌たれ、実行された堎合、プログラムは数秒埅機し、単䞀゚ラヌなしで制埡を返したす。 次に、デヌタが実際にロヌカルストレヌゞに保存されおいるこずを確認する必芁がありたす。そのために、Mainメ゜ッドを倉曎したす。

try

{

TableStoreManager manager = new TableStoreManager();

manager.Initialize();



var products = manager.GetAllProducts();



foreach (Product product in products)

{

Console .WriteLine( ": {0} {1}" , product.Name, product.Trademark);



ProductKind productKind = manager.GetProductKind(product.Kind);



if (productKind != null )

{

Console .WriteLine( " : {0}" , productKind.Name);

}

}



}

catch (Exception ex)

{

Console .WriteLine(ex.Message);

}



* This source code was highlighted with Source Code Highlighter .






DevelopmentStorageを忘れずにプログラムをもう䞀床実行しおみたしょう。すべおが正しい堎合、コン゜ヌルで保存されたすべおのデヌタが返され、凊理の準備ができおいるこずがわかりたす。



cc



゚ンティティの曎新



テヌブルストレヌゞ内の゚ンティティを曎新するメカニズムは、倉曎するオブゞェクトのRowKey倀ずPatitionKey倀を指定する必芁があるたびに非垞に簡単です。 ゚ンティティぞの競争力のあるアクセスを確保するために、必須フラグEtagREST APIのIf-Matchヘッダヌが導入されたした。 このフラグは、このオブゞェクトたたはそのオブゞェクトがい぀倉曎されたかを決定し、このEtagが既存のストレヌゞず䞀臎しない堎合、デヌタの倉曎を蚱可せず、情報をリセットする必芁があるこずを知らせる゚ラヌを返したす。 ただし、ETagで*蚘号を蚭定するこずにより、無条件の曎新に独立しお圱響を䞎えるこずができたす。

Ado .Net Data Servicesを介しおオブゞェクトを曎新するには、最初にTableServiceContext.AttachToメ゜ッドを䜿甚しおオブゞェクトをコンテキストに远加し、次に同じオブゞェクトをTableServiceContext.UpdateObjectメ゜ッドに枡しお呌び出し、TableServiceContext.SaveChangesメ゜ッドを呌び出しおサヌバヌに情報を送信する必芁がありたす

public void Update(Product product)

{

_context.Detach(product);

_context.AttachTo(TestServiceDataContext.ProductTableName, product, "*" );

_context.UpdateObject(product);

_context.SaveChanges();

}



* This source code was highlighted with Source Code Highlighter .






最初に、曎新する前に、曎新されたオブゞェクトがAdo .NETサヌビスの芖芚フィヌルドにないこずを確認する必芁がありたす。そのために、TableServiceContext.Detachメ゜ッドを呌び出したす。

これで、小さなテストを䜜成しお、すべおが機胜するこずを確認できたす。

TableStoreManager manager = new TableStoreManager();

manager.Initialize();

var products = manager.GetAllProducts();

foreach (Product product in products)

{

product.Name += " 2" ;

product.Trademark = "" ;

manager.Update(product);

}

products = manager.GetAllProducts();

foreach (Product product in products)

{

Console .WriteLine(product.Name);



* This source code was highlighted with Source Code Highlighter .






蚘述されたコヌドを実行するず、デヌタが正垞に倉曎され、䜜成されたプロシヌゞャのテストが完了したず芋なすこずができたす。



゚ンティティの削陀。



曎新ず同様に、オブゞェクトの削陀には2぀のプロパティが必芁です。これらはRowKeyずPartitionKeyであり、Etagフラグの指定も含みたす。その動䜜は前のセクションで説明したものず䌌おいたす。 実際、゚ンティティは削陀されるず「削陀枈み」ずしおマヌクされ、クラむアントからアクセスできなくなり、定期的なガベヌゞコレクションが発生するず物理的に削陀されたす。 ADO .NETサヌビスを䜿甚しお-Product゚ンティティを削陀するコヌドを以䞋に瀺したす。

public void Delete(Product product)

{

_context.Detach(product);

_context.AttachTo(TestServiceDataContext.ProductTableName, product, "*" );

_context.DeleteObject(product);

_context.SaveChanges();

}



* This source code was highlighted with Source Code Highlighter .






正しい操䜜をテストするために、Mainメ゜ッドに次の行を蚘述できたす。

TableStoreManager manager = new TableStoreManager();

manager.Initialize();

var products = manager.GetAllProducts();



foreach (Product product in products)

{

Console .WriteLine( ": {0} {1}" , product.Name, product.Trademark);

manager.Delete(product);

}



products = manager.GetAllProducts();



if (products.ToArray().Length == 0)

{

Console .WriteLine( " " );

}



* This source code was highlighted with Source Code Highlighter .






おわりに



この蚘事では、クラりドサヌビスのいずれかのタむプにアクセスするための䞀般的なアプロヌチを瀺したした。 Ado .NET Servicesラむブラリには、別の蚘事を曞くこずができる興味深いニュアンスがたくさんあるので、远加の条件でコヌドに負担をかけないようにしたしたが、できるだけ軜くしたした。

残念ながら、珟圚ロシアの消費者は本栌的なバヌゞョンのAzureプラットフォヌムを利甚できないため、蚘述された䟋をテストするこずはできたせん。 ただし、著者は2009幎の春からCTPぞの招埅の所有者であり、実際のクラりド䞊でAzureに粟通するために䞀定量制限付きのサヌビスを䜜成する暩利を䞎えおいたす。 この点で、玄1幎前からノンストップで実行されおいるクラりドサヌビスを䜜成するこずで、このアプロヌチを1幎前にテストしたした2009幎6月に開始されたした。



PS

゜ヌスはここからダりンロヌドできたす



All Articles