(※ 2021/12/05 20:45 誤字修正と一部追記を行いました。)
エンタープライズサービス部の乙黒です。 この記事は「NEXTSCAPE Advent Calendar 2021」の5日目です。 qiita.com
本記事では、Azure Batchの利用時に考慮すべき項目について書かせていただきます。 弊社ではAzure Bathを使った動画配信ファイルのクラウドエンコードサービスなどを開発しています。そのような事例で設計・開発時にハマった点などを紹介していこうと思います。
Azure Batchそのものについてはこの記事では説明を省略します。
また、記事には頻繁にクォータに関連した内容が出てきます。 他のAzureのサービス同様、Azure Batchにおいてもクォータの制限は考慮をする必要があります。 クォータの具体的な内容については下記のぺージをご参考ください docs.microsoft.com
アカウントの単位
Azure Batchのアカウント数のクォータはデフォルトでは1サブスクリプションに1~3つに制限されています。
アカウント数は最大50まで増やすことができますが、例えば同じサービス向けのシステム内で「動画ファイルの変換処理」と「画像ファイルの変換処理」でアカウントを分ける様な設計は避けた方が良いと思います。
一方、例えば
- 1つのサブスクリプションにプロダクション環境、ステージング環境が併存していて、リソースグループで分けて運用している。
- 担当顧客ごとに保守管理ができるメンバーを分ける必要がある。
などRBACの割り当てを分ける必要がある場合は、クォータの増加を申請して、個別のアカウントを作成すべきでしょう。
ジョブの単位
アクティブなジョブ数のクォータはデフォルトでは100~300となっています。 一見多いように見えますが、例えばコンテンツ毎にジョブを作成してしまいますと、運用の状況によってはすぐに上限に達してしまいます。
そのため、基本的にジョブは「動画ファイルの変換処理」、「画像ファイルの変換処理」など大まかな処理単位で分け、個別のコンテンツはタスク単位にすべきでしょう。
また、ジョブの単位を考えるにあたって考慮すべきはジョブに含まれるタスクの実行順序です。Azure Batchにおいて、ジョブ内のタスクの実行順序は既定されていません。つまり、未処理のタスクが溜まってしまったとき、一番古いタスクが最後まで未処理のままにされてしまうという危険性があります。 一方、ジョブには優先度の設定が存在しますので、公開日が近く、早めに処理を終わらせたいコンテンツのタスクは、優先度を高く設定したジョブに追加する設計が必要になります。
(※ 2021/12/05 20:45 追記)
もう1点、タスクの実行順序が保証されない関係で考慮すべきことがあります。
- 日時に関係なく、絶え間なくタスクが投入される類の処理のジョブ
- Azureの予約購入を有効利用するために、オートスケーリングの最大ノード数をピーク時のタスク数より抑えて、平均ノード数が円滑化されるようにしている
などの場合、日毎・時間毎など時間単位でジョブを分けることも検討すべきです。 仮に1つのジョブに対してタスクを絶え間なく作成し続けてしまうと、後から作成されたタスクが先に処理され、いつまで経っても処理されないタスクが発生する危険性があるからです。
ジョブ、タスクの制約
ジョブ、タスクのプロパティには
- タスクの最大再試行回数
- 最大実時間
など「制約」があります。「最大実時間」もタスクについての項目です。 例えば、タスクの中で実行したアプリケーションがハングアップした場合、「最大実時間」を無制限にしておくと延々と完了しないタスクが維持されてしまい、ゴミデータとして残ってしまいます。そこで、余裕をもった「最大実時間」を設定しておけば、その時間を過ぎても完了しなかったタスクはリキューされ、「タスクの最大試行回数」を超えないうちはAzure Batchのタスク内で勝手にリトライを走らせてくれます。
プール、ノードの監視
例えば、ノードのディスク容量が足りなくなると、そのノードは「使用不可」の状態になります。厳密に調べたわけではないのですが、「使用不可」のノードはプールのノード数のオートスケーリングを設定していても、うまくハンドリングできなくなるようです。
なので、Azure Batchで処理するタスクによっては定期的にAzure Batchアカウントからノードを取得して状態を確認するFunction Appを実行させておく方が安全です。
最後に
他にもAzure Batchのプールのスケーリング設定など書きたいことはあるのですが、まとまりがなくなってしまそうなため、またいずれ機会があれば別記事で紹介させていただこうと思います。 最後までお読みいただきありがとうございました。