データ API ビルダーでは、メモリ内キャッシュとキャッシュ関連の HTTP 要求ヘッダー (no-store、L1no-cache、only-if-cachedなど) が長くサポートされており、キャッシュの動作に影響します。
レベル 2 (L2) キャッシュは、分散キャッシュ レイヤーを追加することで、ローカル プロセスを超えてキャッシュを拡張します。
L2を使用すると、キャッシュされた結果を複数の DAB インスタンス間で再利用でき、個々のコンテナーの再起動に耐えることができます。これにより、ステートレスデプロイが適切な方法でステートレスに感じにくくなります。
レベル 2 キャッシュの利点
次の場合は、レベル 2 のキャッシュを使用します。
- スケールアウトされた DAB インスタンス間でキャッシュされた結果を共有する
- 繰り返し読み取りのデータベース ラウンド トリップを減らす
- リサイクルまたは再デプロイ後にステートレス コンテナーをウォーム状態に保つ
- 読み取り負荷の高いワークロードのパフォーマンスを向上させる
- パーティションを使用した名前空間キャッシュの参加
ランタイム キャッシュ設定の構成
レベル 2 のキャッシュは、 runtime.cacheでグローバルに構成されます。 ランタイム キャッシュ ブロックでは、キャッシュが有効になり、既定の有効期間 (TTL) が設定され、分散キャッシュ プロバイダーが構成されます。
{
"runtime": {
"cache": {
"enabled": true,
"ttl-seconds": 30,
"level-2": {
"enabled": true,
"provider": "redis",
"connection-string": "localhost:6379",
"partition": "prod-api"
}
}
}
}
ランタイム のプロパティ
| 財産 | 説明 |
|---|---|
enabled |
キャッシュのサポートをグローバルに有効にします。 |
ttl-seconds |
既定のキャッシュの有効期間を秒単位で設定します。 |
level-2.enabled |
分散キャッシュ層をオンにします。 |
level-2.provider |
分散キャッシュ プロバイダーを選択します。 現在、 redis がサポートされています。 |
level-2.connection-string |
Redis インスタンスの接続文字列。 |
level-2.partition |
Redis キーとバックプレーン チャネルの省略可能な名前空間。 同じパーティションを使用するコンテナーのみが、同じ分散キャッシュ領域を共有します。 |
エンティティ固有のキャッシュ動作を構成する
エンティティは、グローバル キャッシュの動作をオーバーライドできます。 エンティティ cache ブロックを使用して、キャッシュを有効にし、カスタム TTL を設定し、キャッシュ レベルを選択します。
{
"entities": {
"Products": {
"source": "dbo.Products",
"cache": { "enabled": true, "ttl-seconds": 120, "level": "L1L2" }
},
"Orders": {
"source": "dbo.Orders",
"cache": { "enabled": true, "level": "L1" }
}
}
}
cache.level プロパティ
エンティティが使用するキャッシュ層を制御するには、 cache.level を使用します。
| 価値 | 説明 |
|---|---|
L1 |
メモリ内キャッシュのみ。 現在の DAB プロセスに対して高速かつローカル。 |
L1L2 |
メモリ内と分散キャッシュ。 このレベルは、キャッシュされたエンティティの既定値です。 |
L2がグローバルに有効になっていない場合、L1L2で構成されたエンティティはL1として動作します。
L1L2 の動作のしくみ
ヒント
Tl;DRL1L2 = L1 → → L2 → データベース → L2 → L1 →応答を要求する
既定では、キャッシュが有効になっているエンティティでは、レベル L1L2が使用されます。
-
L1はプロセスごとのメモリ内キャッシュです。 -
L2は、分散キャッシュ レイヤー (現在は Redis) に加えて、クロスインスタンス コヒーレンス用のバックプレーンです。
L1L2では、キャッシュ参照によって最初にL1がチェックされます。
L1ミスの場合、レベル 2 のキャッシュがグローバルに有効で構成されているかどうかをL2チェックします。 どちらの層にもエントリが見つからない場合、DAB はデータベース クエリを実行します。 結果は、 L1 と L2の両方に格納されます。
これは次のことを意味します。
- 同じインスタンスに対する今後の要求は、ローカルから提供されます
L1 - 他のインスタンスに対する要求は、
L2から読み取り、エントリを独自のインスタンスに昇格させることができますL1 - コンテナーが再起動しても、
L1ミスの後にL2ヒットが発生しても、データベースのラウンド トリップを回避できます
この組み合わせにより、スケールアウトまたはリサイクルされたインスタンス間でウォーム分散キャッシュが提供されます。
Redis のサポート
Redis は、レベル 2 キャッシュの現在のプロバイダーです。 このシナリオでは次の機能がサポートされているため、このシナリオに適しています。
- 複数の DAB インスタンス間の共有アクセス
- TTL ベースのキャッシュのキーの有効期限
- 高スループットワークロードの高速読み取りと書き込み
- インスタンス間のバックプレーン調整
パーティション分割されたキャッシュスペース
オプションの partition 設定を使用して、分散キャッシュ アクティビティを分離します。 DAB では、パーティション値を使用して Redis キーとバックプレーン チャネルの名前空間を設定します。 同じパーティションを共有するコンテナーのみが、同じ分散キャッシュ領域に参加します。
この設定は、次の場合に便利です。
- 運用トラフィックと非運用トラフィックを分離する
- テナントまたは環境を分離する
- 関連のないサービスがキャッシュされたエントリを共有できないようにする