Cache スコープ (<ee:cache/>)

頻繁にコールされるデータを保存して再利用します。

Cache スコープを使用して、Mule インスタンスの処理負荷を減らし、フロー内のメッセージ処理速度を上げることができます。このコンポーネントは、次のタスクで特に効果的です。

  • 同じ情報を繰り返し求める要求の処理。

  • 大容量の反復可能なストリームに関連する情報を求める要求の処理。

Mule アプリケーションのメッセージプロセッサーが Cache スコープにメッセージを送信すると、親フローは出力を要求します。Cache スコープは、メッセージペイロードを処理して、出力を親フローに配信し、出力を保存 (応答をキャッシュ) します。Cache スコープは、次に同じ種類のメッセージペイロードを受信したときに、時間がかかる可能性のあるプロセスを再度呼び出す代わりにキャッシュされた応答を生成できます。

たとえば、Cache スコープを使用して、フライト情報を求める顧客の要求を管理できます。多くの顧客がサンフランシスコからブエノスアイレスへのフライトに関する同じ価格設定情報を要求する場合があります。多くの処理能力を使用して顧客のクエリごとに個別の要求を複数の航空データベースに送信する代わりに、Cache スコープを使用して、航空データベースへの定期的な要求をスケジュールし、キャッシュされた価格をユーザーに提供できます。データの適時性が重要でない場合、Cache スコープで時間と処理能力を節約できます。

任意の数のメッセージプロセッサー (コネクタやコンポーネントなど) を Cache スコープに配置し、スコープ内で発生した処理で生成される応答 (応答メッセージのペイロードが含まれる) を保存するようにキャッシュ戦略を設定できます。

キャッシュ戦略で設定されているオブジェクトストアはクラスター内のすべてのノードで共有されるため、Cache スコープはクラスター化された環境でも機能します。

キャッシュプロセス

Cache スコープは反復可能なストリームをキャッシュします。失われる前に 1 回だけ読み取ることができる反復不可能なストリームはキャッシュしません。コンポーネントのストリーム戦略が反復不可能に設定されていない限り、デフォルトではすべてのストリームが Mule で反復可能です。

一般的なキャッシュプロセスシーケンスは、次のとおりです。

  1. メッセージが Cache スコープに入ります。

  2. Cache スコープは、メッセージペイロードが反復可能かどうかを判断します。

  3. Cache スコープは、メッセージのペイロードを識別するキーを生成します。

    デフォルトでは、Mule は SHA256KeyGenerator および SHA256 ダイジェストを使用して、メッセージペイロードの一意のキーを生成します。ただし、カスタムキャッシュ戦略で独自のキーをセットアップできます。

  4. Cache スコープは、新しく生成されたキーと、以前に処理されてキャッシュされた応答を比較し、セットアップしたオブジェクトストア (推奨) またはデフォルトの ​InMemoryObjectStore​ に保存します。

    • キャッシュされた応答イベントがない場合 (​キャッシュミス​)、Cache スコープは新しいメッセージを処理し、応答を生成します。

      また、結果の応答をオブジェクトストアに保存します (反復可能な応答の場合)。

    • キャッシュされた応答イベントがある場合 (​キャッシュヒット​)、キャッシュ戦略は、新しい要求とキャッシュされた応答の両方のデータを結合する応答を生成します。

      生成された応答が反復不可能なストリームである場合は、応答をキャッシュしません。

  5. Cache スコープは、処理を続行するために応答を親フローにプッシュします。

キャッシュ戦略

キャッシュ戦略は、メッセージが Cache スコープに入ってきたときに Cache スコープが実行するアクションを定義します。デフォルトでは、Cache スコープは、メモリ内のオブジェクトストアにデータを保存するキャッシュ戦略を使用します。既存のオブジェクトストアを参照するカスタムキャッシュ戦略を作成するか、またはこのキャッシュ戦略で使用する新しいカスタムオブジェクトストアを作成することができます。

キャッシュ戦略から定義または参照されるオブジェクトストアでこれらの値を設定することで、キャッシュサイズ、有効期限、許容される最大エントリ数を設定できます。キャッシュへのアクセスを同期するようにキャッシュ戦略を設定して、異なるメッセージプロセッサーが同時にキャッシュを使用できないようにすることもできます。

キャッシュ戦略は、次のカスタマイズも参照できます。

  • オブジェクトストアのイベントキー (ペイロードをオブジェクトストアに保存するためのキーの作成に使用される DataWeave 式または Java オブジェクト)。

  • 戦略の応答ジェネレーター (キャッシュ戦略から返される応答の作成に使用される Java オブジェクトへの参照)。

  • 変更可能または変更不可能なデータのイベントコピー戦略。

キャッシュへの同期アクセス

デフォルトでは、(同じまたは異なる Mule インスタンスの) 複数のメッセージプロセッサーが同時にキャッシュを使用する場合の予期しない結果を回避ために、Mule ではキャッシュへのアクセスが同期されます。

2 つのメッセージプロセッサーがキャッシュから値を取得しようとして、キャッシュ内に値が見つからないシナリオを考えてみます。各メッセージプロセッサーは値を個別に計算し、その値をキャッシュに挿入します。キャッシュへのアクセスが同期されない場合、2 番目のメッセージプロセッサーによって挿入された値が、最初のメッセージプロセッサーによって挿入された値を上書きします。値が異なる場合、同じ入力に対して 2 つの異なる結果が取得され、最後の 1 つのみがキャッシュに保存されます。

一部のシナリオではこの結果は有効ですが、アプリケーションがキャッシュコヒーレンスを必要とする場合は問題になります。キャッシング戦略を同期することで、コヒーレンスが保証されます。同期されたキャッシュは、メッセージプロセッサーによって変更されているときにロックされます。このシナリオのロックされたキャッシュでは、最初のメッセージプロセッサーが値を計算するまで 2 番目のメッセージプロセッサーは強制的に待機させられ、その後キャッシュから値を取得します。

キャッシュの同期を無効にするには、​<ee:object-store-caching-strategy/>​ 要素で ​synchronized​ プロパティを定義して ​false​ に設定することができます。

同期はパフォーマンスに影響し、その影響はクラスターモードで最も深刻になります。

コンポーネント XML

このコンポーネントは、次の XML 構造をサポートします。

<!-- Caching Strategy definition -->
<ee:object-store-caching-strategy
  name="Caching_Strategy"
  doc:name="Caching Strategy">
    <!-- Object Store to use for the caching strategy -->
</ee:object-store-caching-strategy>

<!-- Cache scope referencing the strategy -->
<ee:cache
  doc:name="Cache"
  doc:id="ahiceg"
  cachingStrategy-ref="Caching_Strategy" >
     <!-- Processing logic to cache -->
</ee:cache>
<ee:cache/>​ Attributes 説明

doc:name

コンポーネントの編集可能な名前。

doc:id

コンポーネントの自動生成された識別子。

cachingStrategy-ref

参照するキャッシュ戦略。

<ee:object-store-caching-strategy/>​ Attributes 説明

doc:name

コンポーネントの編集可能な名前。

doc:id

コンポーネントの自動生成された識別子。

keyGenerationExpression

省略可能。キーを生成する DataWeave 式 (​keyGenerationExpression="#[vars.requestId]"​ など)。

synchronized

Mule がキャッシュへのアクセスを同期するかどうかを示します。使用可能な値は ​true​ または ​false​ です。デフォルトは ​true​ です。

次の例は、Cache スコープとキャッシュ戦略を設定する方法を示しています。

例: Cache スコープの設定

キャッシュ戦略の設定例を次に示します。このキャッシュ戦略は、Database Select 操作と Transform コンポーネントを含む Cache スコープによって参照されます。

<!-- Caching Strategy definition-->
<ee:object-store-caching-strategy name="Caching_Strategy" doc:name="Caching Strategy" />

<!-- The Database Connector config is necessary in this example because there is a Database Select operation-->
<db:config name="Database_Config" doc:name="Database Config" >
    <!-- Database Connector Configuration -->
</db:config>

<!-- Cache Scope configuration referencing the Caching Strategy-->
<ee:cache doc:name="Cache" cachingStrategy-ref="Caching_Strategy">
  <db:select doc:name="Select" config-ref="Database_Config">
    <db:sql >
      <!-- An SQL query-->
    </db:sql>
  </db:select>
  <ee:transform doc:name="Transform Message" >
    <ee:message >
      <ee:set-payload >
        <!-- A DataWeave transformation for the query results -->
      </ee:set-payload>
    </ee:message>
  </ee:transform>
</ee:cache>

例: キャッシュ戦略

次の XML の例は、キャッシュへのアクセスを同期し、キャッシュされた応答を保存する永続的なオブジェクトストアを定義するキャッシュ戦略の設定例を示しています。このキャッシュ戦略は、Cache スコープによって参照されています。

<!-- Caching strategy definition -->
<ee:object-store-caching-strategy
  name="Caching_Strategy"
  doc:name="Caching Strategy">
  <!-- Object Store defined for the caching strategy-->
  <os:private-object-store
    alias="CachingStrategy_ObjectStore"
    maxEntries="100"
    entryTtl="10"
    expirationInterval="5"
    config-ref="ObjectStore_Config" />
</ee:object-store-caching-strategy>

<!-- Cache scope referencing the strategy-->
<ee:cache doc:name="Cache" cachingStrategy-ref="Caching_Strategy">
      <!-- Some processing logic to cache-->
</ee:cache>