Azureアーキテクチャガイドまとめ 3 【Webキューワーカー】

## はじめに
[**Azureクラウドアプリケーションアーキテクチャガイド**](https://azure.microsoft.com/ja-jp/campaigns/cloud-application-architecture-guide/)より、7つあるアーキテクチャスタイルの一つ、**Webキューワーカー**に関してまとめます。

#### 連載目次
[Azureアーキテクチャガイドまとめ 1 【はじめに】](https://qiita.com/Catetin0310/items/74249f333d9fbfccd543)
[Azureアーキテクチャガイドまとめ 2【N層】](https://qiita.com/Catetin0310/items/1ab0ae1130f767d770d3)
Azureアーキテクチャガイドまとめ 3 【Webキューワーカー】 → 本記事
[Azureアーキテクチャガイドまとめ 4 【マイクロサービス】](https://qiita.com/Catetin0310/items/06ab890a04baa161cac6)
[Azureアーキテクチャガイドまとめ 5 【CQRS】](https://qiita.com/Catetin0310/items/d0e8b489f6501e4da90b)
[Azureアーキテクチャガイドまとめ 6 【イベントドリブンアーキテクチャ】](https://qiita.com/Catetin0310/items/58f65242a7b71620825b)
[Azureアーキテクチャガイドまとめ 7 【ビッグデータアーキテクチャ】](https://qiita.com/Catetin0310/items/d515fc3fdff68b54f408)
[Azureアーキテクチャガイドまとめ 8 【ビッグコンピューティングアーキテクチャ】](https://qiita.com/Catetin0310/items/eebd754637dcda8ad14d)


## 概要
このアーキテクチャスタイルのコアコンポーネントは以下の3点。

- クライアント要求にこたえる**Webフロントエンド**
- バッチジョブを実行する**ワーカー**
    - もしくはCPUを集中的に使用するタスク
- 非同期メッセージキュー

これらに加えて、一般的に以下のコンポーネントが組み込まれます。

システムの要件にフィットする範囲で、特定の機能を分離し、各種マネージドサービスを組み合わせる、というイメージです。

- 1つまたは複数の**データベース**
- DB読み取り高速化のための**キャッシュ**
- 静的コンテンツを提供する**CDN**

構成図は以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/8fee0c5e-c2dc-ee66-6c2c-aa40bc3ade0e.png)

以下のような特徴を持つアプリケーションに適しています。

- **比較的単純なドメイン**のアプリケーション
- **時間のかかるワークフロー**や**バッチ操作**があるアプリケーション


## 利点
- 理解しやすい**比較的単純**なアーキテクチャ
- **展開と管理の容易さ**
- フロントエンドとワーカーは**独立に拡張可**
- 懸念事項の明確な分離

## 課題
情報の入出力が多いコンポーネントでは、システムの要望に応じてコードが肥大化しやすい傾向があります。

- フロントエンドとワーカーが、**複数の機能を持った単一のコンポーネント**になりやすい (= モノリシックコンポーネント)

- フロントエンドとワーカーがデータスキーマやコードモジュールを共有している場合、**隠れた依存関係**が存在する可能性あり


## ベストプラクティス
各マネージドサービスでベストプラクティスが用意されています。

- 適切であれば、**複数のストレージ技術**を混在させる

- 以下のベストプラクティス設計に準ずる
    - [API 設計のベストプラクティス](https://docs.microsoft.com/ja-jp/azure/architecture/best-practices/api-design)
    - [自動スケールのベストプラクティス](https://docs.microsoft.com/ja-jp/azure/architecture/best-practices/auto-scaling)
    - [キャッシングのベストプラクティス](https://docs.microsoft.com/ja-jp/azure/architecture/best-practices/caching)
    - [CDN のベストプラクティス](https://docs.microsoft.com/ja-jp/azure/architecture/best-practices/cdn)
    - [ジョブに最適なデータストアの使用](https://docs.microsoft.com/ja-jp/azure/architecture/guide/design-principles/use-the-best-data-store)
[データのパーティション分割のベストプラクティス](https://docs.microsoft.com/ja-jp/azure/architecture/best-practices/data-partitioning)



## 対応するAzureサービス
核となるサービスは、**App Service**です。

**Webjobs**はApp Serviceのサービスの一つで、ワーカーの役割を果たします。これらを**Queue Storage**もしくは**Service Bus**でつなげる形です。

アイコンと概要をまとめます。

![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/6dccf54e-c3b7-3578-f12d-a1ffc658a356.jpeg)

先ほどの構成図にあるアーキテクチャを組んだ場合、以下のような構成になります。

※ 図ではDocumentDBになっていますが、現在はCosmosDBとしてリニューアルされていますのでご注意を。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/a9fb676a-c829-0a30-2fcf-6b50fddfe9bd.png)

## まとめ
Webキューワーカーの特徴と、使用されるサービスについて見ていきました。次回はCQRSについてまとめます。お楽しみに！


## 参考リンク
[**Azureアーキテクチャセンター**](https://docs.microsoft.com/ja-jp/azure/architecture/)
[**Azureクラウドアプリケーションアーキテクチャガイド ダウンロードページ**](https://azure.microsoft.com/ja-jp/campaigns/cloud-application-architecture-guide/)