ターゲットベースのスケーリング
ターゲットベースのスケーリングは、お客様に高速で直感的なスケーリング モデルを提供します。このスケーリングは現在、次の拡張機能でサポートされています。
- Service Bus のキューとトピック
- ストレージ キュー
- Event Hubs
- Azure Cosmos DB
ターゲットベースのスケーリングは、これらの種類の拡張機能で既定で使用されていた以前の Azure Functions 増分スケーリング モデルに代わるものです。 増分スケーリングでは、新しいインスタンスの頻度ごとに最大 1 つのワーカーが追加または削除され、スケーリングするタイミングに関する決定が複雑でした。 これに対し、ターゲット ベースのスケーリングでは、一度に 4 つのインスタンスをスケールアップでき、次の簡単なターゲットベースの式に基づいてスケーリングが決定されます。
"インスタンスあたりのターゲット実行数"の既定値は、Azure Functions 拡張機能で使用される SDK から取得されます。 ターゲット ベースのスケーリングを機能させるために変更を加える必要はありません。
Note
同じ関数アプリ内の複数の関数がスケールアウトしようとしている場合、目的のインスタンスの変更を判断するために、それらの間の合計を使用して目的のインスタンスの変更を判断します。 スケールアウト要求はスケールインをオーバーライドします。 スケールアウト要求がなくても、スケールイン要求がある場合は、最大スケールイン値が使用されます。 メトリックに基づく最も正確なスケーリングを行うには、関数アプリごとに 1 つのターゲット ベースのトリガー関数を使用することをお勧めします。
前提条件
ターゲットベースのスケーリングは、従量課金 プランと Premium プランでサポートされています。 関数アプリのランタイムは 4.3.0 以降である必要があります。
オプトアウト
ランタイム スケールの監視がない従量課金プランまたは Premium プランでは、既定でターゲットベースのスケーリングが関数アプリに対して有効になっています。 ターゲット ベースのスケーリングを無効にして増分スケーリングに戻す場合は、次のアプリ設定を関数アプリに追加します。
アプリ設定 | 値 |
---|---|
TARGET_BASED_SCALING_ENABLED |
0 |
ターゲットベースのスケーリングのカスタマイズ
"インスタンスあたりのターゲット実行数" を調整すると、アプリのワークロードに基づいてスケーリング動作の頻度を増やしたり減らしたりできます。 "インスタンスあたりのターゲット実行数" の設定に使用できる設定は、拡張機能ごとに異なります。
次の表は、"インスタンスあたりのターゲット実行数" の値に使用される host.json
値と、その既定値を示しています。
拡張機能 | host.json 値 | 既定値 |
---|---|---|
Service Bus (拡張機能 v5.x 以降、単一ディスパッチ) | extensions.serviceBus.maxConcurrentCalls | 16 |
Service Bus (拡張機能 v5.x 以降、セッション ベースの単一ディスパッチ) | extensions.serviceBus.maxConcurrentSessions | 8 |
Service Bus (拡張機能 v5.x 以降、バッチ処理) | extensions.serviceBus.maxMessageBatchSize | 1000 |
Service Bus (Functions v2.x 以降、単一ディスパッチ) | extensions.serviceBus.messageHandlerOptions.maxConcurrentCalls | 16 |
Service Bus (Functions v2.x 以降、セッション ベースの単一ディスパッチ) | extensions.serviceBus.sessionHandlerOptions.maxConcurrentSessions | 2000 |
Service Bus (Functions v2.x 以降、バッチ処理) | extensions.serviceBus.batchOptions.maxMessageCount | 1000 |
Event Hubs (拡張機能 v5.x 以降) | extensions.eventHubs.maxEventBatchSize | 10 |
Event Hubs (拡張機能 v3.x 以降) | extensions.eventHubs.eventProcessorOptions.maxBatchSize | 10 |
Event Hubs (定義されている場合) | extensions.eventHubs.targetUnprocessedEventThreshold | N/A |
ストレージ キュー | extensions.queues.batchSize | 16 |
Azure Cosmos DB の "インスタンスあたりのターゲット実行数" は、次の関数属性で設定されます。
拡張機能 | 関数トリガーの設定 | 既定値 |
---|---|---|
Azure Cosmos DB | maxItemsPerInvocation | 100 |
詳細については、サポートされている拡張機能の構成の例を参照してください。
ランタイム スケールの監視が有効になっている Premium プラン
ランタイム スケールの監視では、拡張機能によってターゲット ベースのスケーリングが処理されます。 そのため、関数アプリのランタイム バージョンの要件に加えて、拡張機能パッケージが次の最小バージョンの要件に適合している必要があります。
拡張機能の名前 | 必要な最小バージョン |
---|---|
ストレージ キュー | 5.1.0 |
Event Hubs | 5.2.0 |
Service Bus | 5.9.0 |
Azure Cosmos DB | 4.1.0 |
さらに、ターゲット ベースのスケーリングは現在、ランタイム スケールの監視を使用した オプトイン 機能になっています。 ランタイム スケール監視が有効になっているときに Premium プランでターゲット ベースのスケーリングを使用するには、関数アプリに次のアプリ設定を追加してください。
アプリ設定 | 値 |
---|---|
TARGET_BASED_SCALING_ENABLED |
1 |
動的な同時実行制御のサポート
ターゲットベースのスケーリングでは、より高速なスケーリングが導入され、"インスタンスあたりのターゲット実行数" の既定値が使用されます。 Service Bus キューまたは Storage キューを使用する場合は、動的な同時実行制御を有効にすることもできます。 この構成では、動的な同時実行制御機能によって "インスタンスあたりのターゲット実行数" の値が自動的に決定されます。 制限付きの同時実行制御から始まり、時間の経過に伴って最適な設定が特定されます。
サポートされる拡張機能
host.json ファイルでターゲット ベースのスケーリングを構成する方法は、特定の拡張機能の種類によって異なります。 このセクションでは、ターゲット ベースのスケーリングを現在サポートしている拡張機能の構成の詳細について説明します。
Service Bus のキューとトピック
Service Bus 拡張機能では、Service Bus トリガーの IsBatched
属性と IsSessionsEnabled
属性で決定される 3 つの実行モデルがサポートされています。 IsBatched
と IsSessionsEnabled
の既定値は false
です。
実行モデル | IsBatched | IsSessionsEnabled | "インスタンスあたりのターゲット実行数" に使用される設定 |
---|---|---|---|
単一ディスパッチ処理 | false | false | maxConcurrentCalls |
単一ディスパッチ処理 (セッション ベース) | false | true | maxConcurrentSessions |
バッチ処理 | true | false | maxMessageBatchSize or maxMessageCount |
Note
スケーリングの効率: Service Bus 拡張機能の場合、リソースに対して "管理" 権限を使用すると最も効率的なスケーリングを行うことができます。 "リッスン" 権限では、スケーリングの決定を通知するためにキューまたはトピックの長さを使用できないため、増分スケーリングに戻ります。 Service Bus アクセス ポリシーで権限を設定する方法の詳細については、「共有アクセス承認ポリシー」を参照してください。
単一ディスパッチ処理
このモデルでは、関数の各呼び出しで 1 つのメッセージが処理されます。 maxConcurrentCalls
設定で、"インスタンスあたりのターゲット実行数" を制御します。 具体的な設定は、Service Bus 拡張機能のバージョンによって異なります。
次の例のように、host.json
で maxConcurrentCalls
設定を変更します。
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxConcurrentCalls": 16
}
}
}
単一ディスパッチ処理 (セッション ベース)
このモデルでは、関数の各呼び出しで 1 つのメッセージが処理されます。 ただし、Service Bus のトピックまたはキューのアクティブなセッションの数に応じて、各インスタンスは 1 つ以上のセッションをリースします。 具体的な設定は、Service Bus 拡張機能のバージョンによって異なります。
次の例のように、host.json
で maxConcurrentSessions
設定を変更し、"インスタンスあたりのターゲット実行数" を設定します。
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxConcurrentSessions": 8
}
}
}
バッチ処理
このモデルでは、関数の各呼び出しでメッセージのバッチが処理されます。 具体的な設定は、Service Bus 拡張機能のバージョンによって異なります。
次の例のように、host.json
で maxMessageBatchSize
設定を変更し、"インスタンスあたりのターゲット実行数" を設定します。
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxMessageBatchSize": 1000
}
}
}
Event Hubs
Azure Event Hubs では、イベント ハブ内のすべてのパーティションに分散された未処理のイベントの数に基づいて Azure Functions がスケーリングされます。 既定では、"インスタンスあたりのターゲット実行数" に使用される host.json
属性は maxEventBatchSize
と maxBatchSize
です。 ただし、ターゲット ベースのスケーリングを微調整する場合は、オーバーライドする個別のパラメーター targetUnprocessedEventThreshold
を定義すると、バッチ設定を変更せずに "インスタンスあたりのターゲット実行数" を設定できます。 targetUnprocessedEventThreshold
を設定すると、未処理のイベント数の合計がこの値で除算され、インスタンスの数が決定されます。これは、バランスの取れたパーティション分散を作成するワーカー インスタンス数に切り上げられます。
Note
Event Hubs はパーティション分割されたワークロードであるため、Event Hubs のターゲット インスタンス数はイベント ハブ内のパーティションの数によって制限されます。
具体的な設定は、Event Hubs 拡張機能のバージョンによって異なります。
次の例のように、host.json
で maxEventBatchSize
設定を変更し、"インスタンスあたりのターゲット実行数" を設定します。
{
"version": "2.0",
"extensions": {
"eventHubs": {
"maxEventBatchSize" : 10
}
}
}
host.json
で定義されている場合は、次の例のように、maxEventBatchSize
の代わりに targetUnprocessedEventThreshold
が "インスタンスあたりのターゲット実行数" として使用されます。
{
"version": "2.0",
"extensions": {
"eventHubs": {
"targetUnprocessedEventThreshold": 23
}
}
}
ストレージ キュー
Storage 拡張機能の v2.x 以降の場合は、host.json
で batchSize
設定を変更して、"インスタンスあたりのターゲット実行数" を設定します。
{
"version": "2.0",
"extensions": {
"queues": {
"batchSize": 16
}
}
}
Azure Cosmos DB
Azure Cosmos DB では、関数レベルの属性 MaxItemsPerInvocation
を使用します。 この関数レベルの属性の設定方法は、関数言語によって異なります。
コンパイル済みの C# 関数の場合は、次のインプロセス C# 関数の例に示すように、トリガー定義で MaxItemsPerInvocation
を設定します。
namespace CosmosDBSamplesV2
{
public static class CosmosTrigger
{
[FunctionName("CosmosTrigger")]
public static void Run([CosmosDBTrigger(
databaseName: "ToDoItems",
collectionName: "Items",
MaxItemsPerInvocation: 100,
ConnectionStringSetting = "CosmosDBConnection",
LeaseCollectionName = "leases",
CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents,
ILogger log)
{
if (documents != null && documents.Count > 0)
{
log.LogInformation($"Documents modified: {documents.Count}");
log.LogInformation($"First document Id: {documents[0].Id}");
}
}
}
}
Note
Azure Cosmos DB はパーティション分割されたワークロードであるため、データベースのターゲット インスタンス数は、コンテナー内の物理パーティションの数によって制限されます。 Azure Cosmos DB のスケーリングの詳細については、物理パーティションに関する記事とリース所有権に関する記事を参照してください。
次の手順
詳細については、以下の記事をお読みください。