次の方法で共有


レベル 2 キャッシュを実装する

データ API ビルダーでは、メモリ内キャッシュとキャッシュ関連の HTTP 要求ヘッダー (no-storeL1no-cacheonly-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 はデータベース クエリを実行します。 結果は、 L1L2の両方に格納されます。

これは次のことを意味します。

  • 同じインスタンスに対する今後の要求は、ローカルから提供されます L1
  • 他のインスタンスに対する要求は、 L2 から読み取り、エントリを独自のインスタンスに昇格させることができます L1
  • コンテナーが再起動しても、 L1 ミスの後に L2 ヒットが発生しても、データベースのラウンド トリップを回避できます

この組み合わせにより、スケールアウトまたはリサイクルされたインスタンス間でウォーム分散キャッシュが提供されます。

Redis のサポート

Redis は、レベル 2 キャッシュの現在のプロバイダーです。 このシナリオでは次の機能がサポートされているため、このシナリオに適しています。

  • 複数の DAB インスタンス間の共有アクセス
  • TTL ベースのキャッシュのキーの有効期限
  • 高スループットワークロードの高速読み取りと書き込み
  • インスタンス間のバックプレーン調整

パーティション分割されたキャッシュスペース

オプションの partition 設定を使用して、分散キャッシュ アクティビティを分離します。 DAB では、パーティション値を使用して Redis キーとバックプレーン チャネルの名前空間を設定します。 同じパーティションを共有するコンテナーのみが、同じ分散キャッシュ領域に参加します。

この設定は、次の場合に便利です。

  • 運用トラフィックと非運用トラフィックを分離する
  • テナントまたは環境を分離する
  • 関連のないサービスがキャッシュされたエントリを共有できないようにする

こちらも参照ください