クラウドデザインパターンCloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications
kyrt @takekazuomi 2
自己紹介
近江 武一JAZUG Azure Storage 担当(自称)
Microsoft MVP for Azure
kyrt @takekazuomi 3
kyrt.in
github.com/takekazuomiwhite
paper
kyrt @takekazuomi 4
紹介• Microsoft patterns & practices • Cloud Design Patterns: Prescriptive
Architecture Guidance for Cloud Applications• http://
msdn.microsoft.com/en-us/library/dn568099.aspx• 翻訳が、2014年6月に出ました
• クラウドデザインパターン Azureを例としたクラウドアプリケーション設計の手引き• http://ec.nikkeibp.co.jp/item/books/P98330.html• 日経BP
以下、CDP本と記述
内容
クラウドアプリケーション設計の頻出課題集
Software design pattern の Cloud Application 版
•24 のパターン•10 のガイダンスポスター• http
://azure.microsoft.com/en-us/documentation/infographics/cloud-design-patterns/
kyrt @takekazuomi 5
JAZUG で監訳
•翻訳と監訳のはざまに悩みつつも de:code で出せるように奮闘
kyrt @takekazuomi 6
回答集じゃない
課題が整理され、考慮点について記述されている
•8 つの問題領域•10 つの code sample
kyrt @takekazuomi 7
Design Patterns with Sample Code
kyrt @takekazuomi 8
名称 可用性データ管理
設計実装
メッセージング
管理監視
パフォーマンススケーラビリ
ティ回復性
セキュリティ
Code samples
Competing Consumers Pattern ◯ ◯Compute Resource Consolidation Pattern ◯ ◯External Configuration Store Pattern ◯ ◯ ◯Health Endpoint Monitoring Pattern ◯ ◯ ◯
Leader Election ○ ○ ○
Pipes and Filters Pattern ◯ ◯ ◯
Priority Queue Pattern ◯ ◯ ◯Runtime Reconfiguration Pattern ◯ ◯ ◯
Static Content Hosting Pattern ◯ ◯ ◯ ◯
Valet Key Pattern ◯ ◯ ◯
kyrt @takekazuomi 9
Sample Codesサンプルコードをざっと見ていこう
kyrt @takekazuomi 10
前準備
•Web Platform Installer •Microsoft Visual Studio 2012/2013 •Windows Azure Tools for Microsoft Visual Studio• http://azure.microsoft.com/ja-jp/develop/net/
•Azure Trial• http://azure.microsoft.com/ja-jp/pricing/free-trial/ kyrt @takekazuomi 112014/2/26
Codes•細かいところがなかなか興味深い•概要を紹介•パターンの内容自体はざっくり流して、細かいところを見る
•注意• Azure Storage のバージョンが 2.1.x で古い。最新は、 4.2.0 (7/28 release)• Azure SDK が、 2.2 (2.3 へ変換で動く)
kyrt @takekazuomi 12
場所
•Cloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications• http://msdn.microsoft.com/en-us/library/dn568099.aspx
•サンプルコード• http://aka.ms/Cloud-Design-Patterns-Sample
kyrt @takekazuomi 13
Cloud Design Patterns Examples.zip
Competing ConsumersCompute Resource ConsolidationExternal Configuration StoreHealth Endpoint MonitoringLeader ElectionPipes and FiltersPriority QueueRuntime ReconfigurationStatic Content HostingValet Key+Readme files
kyrt @takekazuomi 14
Competing Consumers Pattern競争する消費者のパターン
kyrt @takekazuomi 15
Competing Consumers Pattern
図引用 http://msdn.microsoft.com/en-us/library/dn568101.aspxkyrt @takekazuomi 16
•競争する消費者のパターン
Outline•送る側は投げるだけ、処理する側は Queueからひたすら読んで処理する•ワークロードの急増を平準化する•ワークロードを負荷分散させる•信頼性を改善する
kyrt @takekazuomi 17
Project 構成
•CompetingConsumers.ccproj• Azure の Role 定義
•CompetingConsumers.Shared.csproj• Sender,Receiver の共通
•Receiver.csproj•右の Consumer
•Sender.csproj•左の Producer
kyrt @takekazuomi 18
コード構成
•2つのコンポーネントで構成• Sender worker role • Service Bus Queueにメッセージを送信
• Receiver worker role• Queue からメッセージを読んで処理をする
•Receiver worker は、 2 インスタンスが起動するように初期構成
kyrt @takekazuomi 19
Service Bus Queue の Utility ClassCompetingConsumers.Shared.QueueManagerコンパクトな使用例•Start()•Stop()•SendMessagesAsync()•ReceiveMessages()
kyrt @takekazuomi 20
async Task QueueManager.Start()•Receiver.OnStart(), Sender.OnStart() の両方で呼ぶ• Queue の作成、起動される順番は不定
•Queue の作成処理は idempotent にする•存在 Check-> 作成 -> MessagingEntityAlreadyExistsException は、 TraceWarning (エラーじゃない)
•MessagingException• InnerException as WebException !=null の場合は、 API のエ
ラー、 HttpStatusCode でエラーコードがわかる
kyrt @takekazuomi 21
async Task QueueManager.Start()queueDescription.MaxDeliveryCount = 3;
•Brokered Messaging: Dead Letter Queue• http://code.msdn.microsoft.com/windowsazure/Brokered-Messaging-Dead-22536dd8/sourcecode?fileId=76870&pathId=497121593
kyrt @takekazuomi 22
Compute Resource Consolidation Patternコンピューティング リソースの統合 パターン1.5 章 P32
kyrt @takekazuomi 23
Compute Resource Consolidation Pattern
図引用 http://msdn.microsoft.com/en-us/library/dn589778.aspxkyrt @takekazuomi 24
コンピューティング リソースの統合 パターン
Outline•separation of concerns(SoC、関心の分離)の設計原則に沿って分割•論理設計の簡素化
•複数のタスクを同一の計算ユニットで実行する(=統合)•費用対効果の最適化
kyrt @takekazuomi 25
Project 構成
•ComputeResourceConsolidation.ccproj• Role 定義
•ComputeResourceConsolidation.Worker.ccproj•WorkerRole
kyrt @takekazuomi 26
コード構成
•WorkerRole に全部ある
•MyWorkerTask[12](CancellationToken ct)•サンプルの worker role task• Trace.TraceInformation して、 Task.Delay して loop•#1 は、 30 秒間隔で、 #2 は、 5 分間隔で動作• CancellationToken で中断• Task.Delay() のところにコードを入れる
kyrt @takekazuomi 27
WorkerRole.Run()•Run()•バックグラウンド処理の一般例• Task.WaitAny() して、 Task の完了待ち• AggregateException では、 OperationCanceledException は、キャンセル処理 (Stop) を実行
kyrt @takekazuomi 28
WorkerRole.Run():L61,L74,L98•L61 catch (AggregateException ex) •キャンセルでここに来た場合でも、まだ動いているタスクがあることを忘れない( L71)• cts.IsCancellationRequested でない場合は、全部のタスクをキャンセル (Stop) してる
•L74, L98:Stop(TimeSpan.FromMinutes(5))• L98 、 OnStop() の執行猶予は 5 分• L74 は任意で可
kyrt @takekazuomi 29
kyrt @takekazuomi 30
External Configuration Store Pattern構成情報の外部ストア保存 パターン1.8 P62
kyrt @takekazuomi 31
External Configuration Store Pattern
図引用 http://msdn.microsoft.com/en-us/library/dn589803.aspxkyrt @takekazuomi 32
構成情報の外部ストア保存 パターン
Outline•アプリケーションのデプロイと構成情報( config )を分離•アプリケーションの再デプロイなしに、構成情報を変更•アプリケーション間で構成情報を共有
kyrt @takekazuomi 33
コード構成
•WorkerRole.cs• WorkerRole Class
• ExternalConfigurationManager.cs• 設定の Cache 、取得• 変更監視
• ExternalConfiguration.cs• ExternalConfigurationManager の Factory Class• Lazy<> を利用した典型的な実装
• BlobSettingsStore.cs• 設定を Blob に保存する Store
kyrt @takekazuomi 34
WorkerRole.OnStart():L43•デフォルトの構成情報を UL• L85: パッケージに含まれるので上書
•構成上の変更イベントを Subscribe• L52: ExternalConfiguration.Instance.Changed.Subscribe
kyrt @takekazuomi 35
WorkerRole.OnStop():L65•Blog にあげた構成情報ファイルを削除• DeleteConfigurationBlob():L94• コンテナごと削除
•デプロイ後に構成情報を変更した場合• 再デプロイではパッケージに含まれる構成情報に戻る• 構成情報を共有している場合は upload, delete のタイミングを検討• Version Check して「新しければUL で削除はしない」という実装
もある( ETag では不可)
kyrt @takekazuomi 36
ISettingsStore
•サンプルコードには、本の P65 と違って Update() が無い•問題ないというか無い方が良い
kyrt @takekazuomi 37
public interface ISettingsStore{ Task<string> GetVersionAsync();
Task<Dictionary<string, string>> FindAllAsync();}
BlobSettingsStore•async Task<string> GetVersionAsync() :L40• FetchAttributesAsync() は HEAD を使う、 Bodyの転送が伴わないので ETag は効率的• ETag だと同一性の判断ができても新旧の区別が不可
kyrt @takekazuomi 38
おまけ
•Azure Files •同一データセンター内なら SMB 2.1 でマウント可• net use z: \\myaccount.file.core.windows.net\myshare
/u:myaccount StgAccKey==
•データセンター外からでも AzCopy 2.4 以降で copy 可• Storage Client library 4.0 からサポートあり•Microsoft Azure Files サービスの概要• http://
blogs.msdn.com/b/windowsazurej/archive/2014/06/05/blog-introducing-microsoft-azure-file-service.aspx
kyrt @takekazuomi 39
Health Endpoint Monitoringエンドポイントの健康監視1.11 P82
kyrt @takekazuomi 40
Health Endpoint Monitoring
図引用 http://msdn.microsoft.com/en-us/library/dn589789.aspxkyrt @takekazuomi 41
エンドポイントの健康監視
Outline•サービス監視で http のエンドポイントを使う方法•専用のエンドポイントを作成することで、効果的に監視•ネットワーク的な遅延、応答速度•SSL証明書の有効期限
kyrt @takekazuomi 42
コード構成
•HealthEndPointMonitoring.Web.csproj• Endpoint を実装してる ASP.NET
•HealthEndpointMonitoring.Cloud.ccproj• Azure Project
kyrt @takekazuomi 43
Leader Election Patternリーダー選出 パターン1.13 P99
kyrt @takekazuomi 44
kyrt @takekazuomi 45
図引用 http://msdn.microsoft.com/en-us/library/dn568104.aspx
Outline•Role 内の1つのインスタンスに管理的なJob を委託•障害時には再度選出が行われリーダーが移動•Blob のリースを利用して Mutex を実装•Apache Zookeeper などの外部サービスを使った実装も検討する
kyrt @takekazuomi 46
コード構成
•DistributedMutex.csproj•本体
•LeaderElection.ccproj• Azure Project
•LeaderElection.Tests.csproj• Unit Test
•LeaderElection.Worker.csproj•Worker Role
kyrt @takekazuomi 47
BlobLeaseManager•L51: RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(1), 3);• RetryPolicy は、 LinearRetry
•L76,L138•Debug には、 StorageException のStorageExtendedErrorInformationと、 RequestResult が便利
kyrt @takekazuomi 48
Pipes and Filters Patternパイプとフィルターのパターン1.15 P133
kyrt @takekazuomi 49
kyrt @takekazuomi 50
図引用 http://msdn.microsoft.com/en-us/library/dn568100.aspx
Outline•処理をパイプで繋いでデータを流す•各処理は分割し再利用しやすい•インスタンスを増やす、パイプを増やすで、スケール
kyrt @takekazuomi 51
Project 構成•PipesAndFilters.Cloud.ccproj• Azure Project
• InitialSender.csproj• データ送信の WorkerRole
•PipeFilterA.csproj• データのフィルター A の WorkerRole
•PipeFilterB.csproj• データのフィルター B の WorkerRole
• FinalReceiver.csproj• 最後にデータを受ける WorkerRole
kyrt @takekazuomi 52
コード構成
•QueueManager.cs• Competing Consumers の QueueManager とほとんど同
じだけどちょっと違う。参考にするときは両方見ると良い
•ServiceBusPipeFilter.cs• Start() は、 idempotent にする• OnPipeFilterMessageAsync() がフィルター本体• フィルターの関数 Func<BrokeredMessage,
Task<BrokeredMessage>> を受け取って、結果の Mesasgeを、 out queue に送る
kyrt @takekazuomi 53
kyrt @takekazuomi 54
終わりに
kyrt @takekazuomi 55
•Queue が全部 Service Bus Queue だけど、 Storage Queue 使おうよ
•Special Thanks•Source Han Sans• https://github.com/adobe-fonts/source-han-sans/
kyrt @takekazuomi 56
おまけ祝、 Storage Client Library 4.2.0 がリリースされました
kyrt @takekazuomi 57
Windows Azure Storage 4.2.0 (1)2014/7/28 リリース、変更内容• All: リソース名のバリデーションを行う NameValidator class を追加• All: LogRecord の RequestUrl で HTML4 decoded が間違っていた
BUGを修正• All: 許可された最大実行時間は24 日 • All: log line error の文言変更• All (WP): Windows Phoneアプリケーションをストアに提出するさい
に必要な認証に失敗する問題を修正• All (WP): Windows Phone 8.1 Silverlight support を追加
kyrt @takekazuomi 58
Windows Azure Storage 4.2.0 (2)•Blobs: blob snapshots の SAS tokens をサポート•Blobs: CloudBlobClient.DefaultDelimiter の “ \” を禁止 • https://
github.com/Azure/azure-storage-net/commit/905e9f260b8c673988cee9903092af7c71517270#diff-90cd11bb9518ee4bff77205ad15cf726R218
•Queues (RT): queue に、 message を追加するときに、 messagettl と visibilitytimeout の query parameters が正しく設定されない問題を修正kyrt @takekazuomi 59
Windows Azure Storage 4.2.0 (3)•Tables: CloudTable.DeleteIfExists 、 async 版は、 Table が存在しない場合に、exception ではなく false を返す• https://github.com/Azure/azure-storage-net/releases/tag/v4.2.0• http://www.nuget.org/packages/WindowsAzure.Storage/4.2.0 kyrt @takekazuomi 60
Recommended