60
ククククククククククククククククククク kyrt / Takekazu Omi http://kyrt.in [email protected] @takekazuomi 2014/7/30 1.0.1

JAZUG クラウドデザインパターンのコードを覗く

Embed Size (px)

DESCRIPTION

「クラウドデザインパターン Azureを例としたクラウドアプリケーション設計の手引き」のサンプルコードを紹介します http://ec.nikkeibp.co.jp/item/books/P98330.html

Citation preview

Page 1: JAZUG クラウドデザインパターンのコードを覗く

クラウドデザインパターンのコードを覗く

kyrt / Takekazu Omi http://[email protected]@takekazuomi

2014/7/30 1.0.1

Page 2: JAZUG クラウドデザインパターンのコードを覗く

クラウドデザインパターンCloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications

kyrt @takekazuomi 2

Page 3: JAZUG クラウドデザインパターンのコードを覗く

自己紹介

近江 武一JAZUG Azure Storage 担当(自称)

Microsoft MVP for Azure

kyrt @takekazuomi 3

kyrt.in

github.com/takekazuomiwhite

paper

Page 4: JAZUG クラウドデザインパターンのコードを覗く

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本と記述

Page 5: JAZUG クラウドデザインパターンのコードを覗く

内容

クラウドアプリケーション設計の頻出課題集

Software design pattern の Cloud Application 版

•24 のパターン•10 のガイダンスポスター• http

://azure.microsoft.com/en-us/documentation/infographics/cloud-design-patterns/

kyrt @takekazuomi 5

Page 6: JAZUG クラウドデザインパターンのコードを覗く

JAZUG で監訳

•翻訳と監訳のはざまに悩みつつも de:code で出せるように奮闘

kyrt @takekazuomi 6

Page 7: JAZUG クラウドデザインパターンのコードを覗く

回答集じゃない

課題が整理され、考慮点について記述されている

•8 つの問題領域•10 つの code sample

kyrt @takekazuomi 7

Page 8: JAZUG クラウドデザインパターンのコードを覗く

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   ◯           ◯ ◯

Page 9: JAZUG クラウドデザインパターンのコードを覗く

kyrt @takekazuomi 9

Page 10: JAZUG クラウドデザインパターンのコードを覗く

Sample Codesサンプルコードをざっと見ていこう

kyrt @takekazuomi 10

Page 11: JAZUG クラウドデザインパターンのコードを覗く

前準備

•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

Page 12: JAZUG クラウドデザインパターンのコードを覗く

Codes•細かいところがなかなか興味深い•概要を紹介•パターンの内容自体はざっくり流して、細かいところを見る

•注意• Azure Storage のバージョンが 2.1.x で古い。最新は、 4.2.0 (7/28 release)• Azure SDK が、 2.2 (2.3 へ変換で動く)

kyrt @takekazuomi 12

Page 13: JAZUG クラウドデザインパターンのコードを覗く

場所

•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

Page 14: JAZUG クラウドデザインパターンのコードを覗く

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

Page 15: JAZUG クラウドデザインパターンのコードを覗く

Competing Consumers Pattern競争する消費者のパターン

kyrt @takekazuomi 15

Page 16: JAZUG クラウドデザインパターンのコードを覗く

Competing Consumers Pattern

図引用 http://msdn.microsoft.com/en-us/library/dn568101.aspxkyrt @takekazuomi 16

•競争する消費者のパターン

Page 17: JAZUG クラウドデザインパターンのコードを覗く

Outline•送る側は投げるだけ、処理する側は Queueからひたすら読んで処理する•ワークロードの急増を平準化する•ワークロードを負荷分散させる•信頼性を改善する

kyrt @takekazuomi 17

Takekazu Omi
このページには短い概要を書く、内容を書き直す
Page 18: JAZUG クラウドデザインパターンのコードを覗く

Project 構成

•CompetingConsumers.ccproj• Azure の Role 定義

•CompetingConsumers.Shared.csproj• Sender,Receiver の共通

•Receiver.csproj•右の Consumer

•Sender.csproj•左の Producer

kyrt @takekazuomi 18

Page 19: JAZUG クラウドデザインパターンのコードを覗く

コード構成

•2つのコンポーネントで構成• Sender worker role • Service Bus Queueにメッセージを送信

• Receiver worker role• Queue からメッセージを読んで処理をする

•Receiver worker は、 2 インスタンスが起動するように初期構成

kyrt @takekazuomi 19

Page 20: JAZUG クラウドデザインパターンのコードを覗く

Service Bus Queue の Utility ClassCompetingConsumers.Shared.QueueManagerコンパクトな使用例•Start()•Stop()•SendMessagesAsync()•ReceiveMessages()

kyrt @takekazuomi 20

Page 21: JAZUG クラウドデザインパターンのコードを覗く

async Task QueueManager.Start()•Receiver.OnStart(), Sender.OnStart() の両方で呼ぶ• Queue の作成、起動される順番は不定

•Queue の作成処理は idempotent にする•存在 Check-> 作成 -> MessagingEntityAlreadyExistsException は、 TraceWarning (エラーじゃない)

•MessagingException• InnerException as WebException !=null の場合は、 API のエ

ラー、 HttpStatusCode でエラーコードがわかる

kyrt @takekazuomi 21

Page 23: JAZUG クラウドデザインパターンのコードを覗く

Compute Resource Consolidation Patternコンピューティング リソースの統合 パターン1.5 章 P32

kyrt @takekazuomi 23

Page 24: JAZUG クラウドデザインパターンのコードを覗く

Compute Resource Consolidation Pattern

図引用 http://msdn.microsoft.com/en-us/library/dn589778.aspxkyrt @takekazuomi 24

コンピューティング リソースの統合 パターン

Page 26: JAZUG クラウドデザインパターンのコードを覗く

Project 構成

•ComputeResourceConsolidation.ccproj• Role 定義

•ComputeResourceConsolidation.Worker.ccproj•WorkerRole

kyrt @takekazuomi 26

Page 27: JAZUG クラウドデザインパターンのコードを覗く

コード構成

•WorkerRole に全部ある

•MyWorkerTask[12](CancellationToken ct)•サンプルの worker role task• Trace.TraceInformation して、 Task.Delay して loop•#1 は、 30 秒間隔で、 #2 は、 5 分間隔で動作• CancellationToken で中断• Task.Delay() のところにコードを入れる

kyrt @takekazuomi 27

Page 28: JAZUG クラウドデザインパターンのコードを覗く

WorkerRole.Run()•Run()•バックグラウンド処理の一般例• Task.WaitAny() して、 Task の完了待ち• AggregateException では、 OperationCanceledException は、キャンセル処理 (Stop) を実行

kyrt @takekazuomi 28

Page 29: JAZUG クラウドデザインパターンのコードを覗く

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

Page 30: JAZUG クラウドデザインパターンのコードを覗く

kyrt @takekazuomi 30

Page 31: JAZUG クラウドデザインパターンのコードを覗く

External Configuration Store Pattern構成情報の外部ストア保存 パターン1.8 P62

kyrt @takekazuomi 31

Page 32: JAZUG クラウドデザインパターンのコードを覗く

External Configuration Store Pattern

図引用 http://msdn.microsoft.com/en-us/library/dn589803.aspxkyrt @takekazuomi 32

構成情報の外部ストア保存 パターン

Page 33: JAZUG クラウドデザインパターンのコードを覗く

Outline•アプリケーションのデプロイと構成情報( config )を分離•アプリケーションの再デプロイなしに、構成情報を変更•アプリケーション間で構成情報を共有

kyrt @takekazuomi 33

Page 34: JAZUG クラウドデザインパターンのコードを覗く

コード構成

•WorkerRole.cs• WorkerRole Class

• ExternalConfigurationManager.cs• 設定の Cache 、取得• 変更監視

• ExternalConfiguration.cs• ExternalConfigurationManager の Factory Class• Lazy<> を利用した典型的な実装

• BlobSettingsStore.cs• 設定を Blob に保存する Store

kyrt @takekazuomi 34

Page 35: JAZUG クラウドデザインパターンのコードを覗く

WorkerRole.OnStart():L43•デフォルトの構成情報を UL• L85: パッケージに含まれるので上書

•構成上の変更イベントを Subscribe• L52: ExternalConfiguration.Instance.Changed.Subscribe

kyrt @takekazuomi 35

Page 36: JAZUG クラウドデザインパターンのコードを覗く

WorkerRole.OnStop():L65•Blog にあげた構成情報ファイルを削除• DeleteConfigurationBlob():L94• コンテナごと削除

•デプロイ後に構成情報を変更した場合• 再デプロイではパッケージに含まれる構成情報に戻る• 構成情報を共有している場合は upload, delete のタイミングを検討• Version Check して「新しければUL で削除はしない」という実装

もある( ETag では不可)

kyrt @takekazuomi 36

Page 37: JAZUG クラウドデザインパターンのコードを覗く

ISettingsStore

•サンプルコードには、本の P65 と違って Update() が無い•問題ないというか無い方が良い

kyrt @takekazuomi 37

public interface ISettingsStore{ Task<string> GetVersionAsync();

Task<Dictionary<string, string>> FindAllAsync();}

Page 38: JAZUG クラウドデザインパターンのコードを覗く

BlobSettingsStore•async Task<string> GetVersionAsync() :L40• FetchAttributesAsync() は HEAD を使う、 Bodyの転送が伴わないので ETag は効率的• ETag だと同一性の判断ができても新旧の区別が不可

kyrt @takekazuomi 38

Page 39: JAZUG クラウドデザインパターンのコードを覗く

おまけ

•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

Page 40: JAZUG クラウドデザインパターンのコードを覗く

Health Endpoint Monitoringエンドポイントの健康監視1.11 P82

kyrt @takekazuomi 40

Page 41: JAZUG クラウドデザインパターンのコードを覗く

Health Endpoint Monitoring

図引用 http://msdn.microsoft.com/en-us/library/dn589789.aspxkyrt @takekazuomi 41

エンドポイントの健康監視

Page 42: JAZUG クラウドデザインパターンのコードを覗く

Outline•サービス監視で http のエンドポイントを使う方法•専用のエンドポイントを作成することで、効果的に監視•ネットワーク的な遅延、応答速度•SSL証明書の有効期限

kyrt @takekazuomi 42

Page 43: JAZUG クラウドデザインパターンのコードを覗く

コード構成

•HealthEndPointMonitoring.Web.csproj• Endpoint を実装してる ASP.NET

•HealthEndpointMonitoring.Cloud.ccproj• Azure Project

kyrt @takekazuomi 43

Page 44: JAZUG クラウドデザインパターンのコードを覗く

Leader Election Patternリーダー選出 パターン1.13 P99

kyrt @takekazuomi 44

Page 45: JAZUG クラウドデザインパターンのコードを覗く

kyrt @takekazuomi 45

図引用 http://msdn.microsoft.com/en-us/library/dn568104.aspx

Page 46: JAZUG クラウドデザインパターンのコードを覗く

Outline•Role 内の1つのインスタンスに管理的なJob を委託•障害時には再度選出が行われリーダーが移動•Blob のリースを利用して Mutex を実装•Apache Zookeeper などの外部サービスを使った実装も検討する

kyrt @takekazuomi 46

Page 47: JAZUG クラウドデザインパターンのコードを覗く

コード構成

•DistributedMutex.csproj•本体

•LeaderElection.ccproj• Azure Project

•LeaderElection.Tests.csproj• Unit Test

•LeaderElection.Worker.csproj•Worker Role

kyrt @takekazuomi 47

Page 48: JAZUG クラウドデザインパターンのコードを覗く

BlobLeaseManager•L51: RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(1), 3);• RetryPolicy は、 LinearRetry

•L76,L138•Debug には、 StorageException のStorageExtendedErrorInformationと、 RequestResult が便利

kyrt @takekazuomi 48

Page 49: JAZUG クラウドデザインパターンのコードを覗く

Pipes and Filters Patternパイプとフィルターのパターン1.15 P133

kyrt @takekazuomi 49

Page 50: JAZUG クラウドデザインパターンのコードを覗く

kyrt @takekazuomi 50

図引用 http://msdn.microsoft.com/en-us/library/dn568100.aspx

Page 51: JAZUG クラウドデザインパターンのコードを覗く

Outline•処理をパイプで繋いでデータを流す•各処理は分割し再利用しやすい•インスタンスを増やす、パイプを増やすで、スケール

kyrt @takekazuomi 51

Page 52: JAZUG クラウドデザインパターンのコードを覗く

Project 構成•PipesAndFilters.Cloud.ccproj• Azure Project

• InitialSender.csproj• データ送信の WorkerRole

•PipeFilterA.csproj• データのフィルター A の WorkerRole

•PipeFilterB.csproj• データのフィルター B の WorkerRole

• FinalReceiver.csproj• 最後にデータを受ける WorkerRole

kyrt @takekazuomi 52

Page 53: JAZUG クラウドデザインパターンのコードを覗く

コード構成

•QueueManager.cs• Competing Consumers の QueueManager とほとんど同

じだけどちょっと違う。参考にするときは両方見ると良い

•ServiceBusPipeFilter.cs• Start() は、 idempotent にする• OnPipeFilterMessageAsync() がフィルター本体• フィルターの関数 Func<BrokeredMessage,

Task<BrokeredMessage>> を受け取って、結果の Mesasgeを、 out queue に送る

kyrt @takekazuomi 53

Page 54: JAZUG クラウドデザインパターンのコードを覗く

kyrt @takekazuomi 54

Page 55: JAZUG クラウドデザインパターンのコードを覗く

終わりに

kyrt @takekazuomi 55

Page 56: JAZUG クラウドデザインパターンのコードを覗く

•Queue が全部 Service Bus Queue だけど、 Storage Queue 使おうよ

•Special Thanks•Source Han Sans• https://github.com/adobe-fonts/source-han-sans/

kyrt @takekazuomi 56

Page 57: JAZUG クラウドデザインパターンのコードを覗く

おまけ祝、 Storage Client Library 4.2.0 がリリースされました

kyrt @takekazuomi 57

Page 58: JAZUG クラウドデザインパターンのコードを覗く

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

Page 59: JAZUG クラウドデザインパターンのコードを覗く

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

Page 60: JAZUG クラウドデザインパターンのコードを覗く

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