2.3. インバリデーションキャッシュ
Data Grid のインバリデーションキャッシュモードは、共有の永続データストアに対して大量の読み取り操作を実行するシステムを最適化することを目的としています。インバリデーションモードを使用すると、状態の変更が発生したときのデータベースへの書き込み回数を減らすことができます。
インバリデーションキャッシュモードは、Data Grid リモートデプロイメントでは非推奨です。インバリデーションキャッシュモードは、共有キャッシュストアにのみ保存される埋め込みキャッシュで使用してください。
インバリデーションキャッシュモードが効果を発揮するのは、データベースなどの永続的なデータストアがあり、読み取りが多いシステムで読み取りごとにデータベースにアクセスするのを防ぐために Data Grid を最適化手法として使用する場合だけです。
キャッシュがインバリデーション用に設定されている場合、キャッシュ内のデータが変更されるたびに、クラスター内の他のキャッシュにメッセージが送信され、データが古くなったことと、メモリーからデータを削除する必要があることが通知されます。インバリデーションメッセージにより、他のノードのメモリーから古い値が削除されます。このメッセージは、値全体を複製する場合に比べて非常に小さくなります。また、クラスター内の他のキャッシュが、必要な場合にのみ、変更されたデータを遅延的に検索します。共有ストアへの更新は、通常、ユーザーアプリケーションコードまたは Hibernate によって処理されます。
図2.5 インバリデーションキャッシュ
アプリケーションは外部ストアから値を読み取り、他のノードから削除せずにローカルキャッシュに書き込む場合があります。これを実行するには、Cache.put(key, value)
の代わりに Cache.putForExternalRead(key, value)
を呼び出す必要があります。
インバリデーションモードは、すべてのノードが同じデータにアクセスできる共有ストアにのみ適しています。永続ストアなしでインバリデーションモードを使用することは実用的ではありません。ノード間の一貫性を保つために、更新された値を共有ストアから読み取る必要があるためです。
ローカルの非共有キャッシュストアでインバリデーションモードを使用しないでください。インバリデーションメッセージはローカルストアのエントリーを削除せず、一部のノードが古い値を認識します。
インバリデーションキャッシュは、特別なキャッシュローダー (ClusterLoader
) で設定することもできます。ClusterLoader
が有効になっている場合、ローカルノードでキーが見つからない読み取り操作は、最初に他のすべてのノードからキーを要求し、ローカルのメモリーに保存します。これにより、古い値が保存される可能性があるため、古い値に対する許容度が高い場合にのみ使用してください。
同期または非同期のレプリケーション
同期の場合、クラスター内のすべてのノードが古い値をエビクトするまで書き込み操作がブロックされます。非同期の場合、元のブロードキャストは無効化メッセージを無効にしますが、応答を待ちません。つまり、発信者で書き込みが完了した後も、他のノードはしばらくの間古い値を確認します。
トランザクション
トランザクションはインバリデーションメッセージをバッチするために使用できます。トランザクションはプライマリー所有者でキーロックを取得します。
悲観的ロックでは、各書き込みは、すべてのノードにブロードキャストされるロックメッセージをトリガーします。トランザクションのコミット中に、発信者は、影響を受けるすべてのキーを無効にし、ロックを解放する 1 フェーズの準備メッセージ (任意で fire-and-forget) をブロードキャストします。
楽観的ロックを使用すると、発信者は準備メッセージ、コミットメッセージ、およびロック解除メッセージ (任意) をブロードキャストします。1 フェーズの準備またはロック解除メッセージのいずれかが fire-and-forget であり、最後のメッセージは常にロックを解放します。