第5章 アプリケーションの Data Grid 8 への移行
5.1. Data Grid 8 でのマーシャリング
マーシャリング機能は、Data Grid 8 で大幅にリファクタリングされ、内部オブジェクトとユーザーオブジェクトを分離します。
Data Grid が内部クラスのマーシャリングを処理するようになったため、埋め込みキャッシュまたはリモートキャッシュを使用してマーシャラーを設定するときに、これらの内部クラスを処理する必要がなくなりました。
5.1.1. ProtoStream マーシャリング
デフォルトでは、Data Grid 8 は ProtoStream API を使用して、言語に依存しない下位互換性のある形式である Protocol Buffers としてデータをマーシャリングします。
Protobuf エンコーディングはスキーマ定義のフォーマットであり、現在多くのアプリケーションのデフォルト標準であり、Data Grid 7 のデフォルトであった JBoss Marshalling と比較してデータをトランスコードする際の柔軟性が高くなっています。
ProtoStream マーシャラーは Protobuf 形式に基づいているため、DataGrid は最初に Java オブジェクトに変換せずに他のエンコーディングに変換できます。JBoss Marshalling を使用する場合、他の形式に変換する前に、キーと値を Java オブジェクトに変換する必要があります。
Data Grid 8 への移行の一環として、Java クラスに ProtoStream マーシャリングの使用を開始する必要があります。
高レベルから、ProtoStream マーシャラーを使用するには、ProtoStream プロセッサーを使用して SerializationContextInitializer
実装を生成します。まず、@Proto
アノテーションを Java クラスに追加してから、Data Grid が提供する ProtoStream プロセッサーを使用して、以下を含むシリアル化コンテキストを生成します。
-
Java オブジェクトの構造化表現を Protobuf メッセージタイプとして提供する
.proto
スキーマ。 - Java オブジェクトを Protobuf 形式にエンコードするための Marshaller の実装。
埋め込みキャッシュとリモートキャッシュのどちらを使用するかに応じて、Data Grid は SerializationContextInitializer
実装を自動的に登録できます。
ネストされた ProtoStream アノテーション
Data Grid 8.2 は ProtoStream 4.4.0.Final にアップグレードします。これには、場合によっては移行が必要です。
以前のバージョンでは、ProtoStream API は、メッセージが最上位としてのみ生成されたメッセージタイプを正しくネストしませんでした。
永続キャッシュストアに Protobuf でエンコードされたエントリーがある場合は、ProtoStream アノテーションがトップレベルになるように Java クラスを変更する必要があります。これにより、永続化されたメッセージのネストが Java クラスのネストと一致することが保証されます。一致しない場合、データの非互換性の問題が発生する可能性があります。
たとえば、次のようなネストされた Java クラスがある場合:
class OuterClass { class InnerClass { @ProtoField(1) int someMethod() { } } }
InnerClass
が OuterClass
の子ではなくなるように、クラスを調整する必要があります。
class InnerClass { @ProtoField(1) int someMethod() { } }
Data Grid サーバーとのマーシャリング
リモートキャッシュには Protobuf エンコーディングのみを使用し、カスタムタイプには ProtoStream マーシャラーを組み合わせて使用する必要があります。
JBoss マーシャリングなどの他のマーシャラー実装では、Data Grid CLI、Data Grid Console、または Ickle クエリーと互換性のない異なるキャッシュエンコーディングを使用する必要があります。
キャッシュストアと ProtoStream
Data Grid 7.x では、キャッシュストアに永続化するデータは、Data Grid 8 の ProtoStream マーシャラーと互換性がありません。データを DataGrid7.x
キャッシュストアから Data Grid 8 キャッシュストアに移行するには、StoreMigrator ユーティリティーを使用する必要があります。
5.1.2. 代替マーシャラーの実装
Data Grid は、ProtoStream の代替マーシャラー実装を提供し、古いバージョンからの移行を容易にします。これらの代替マーシャラーは、ProtoStream マーシャリングに移行する際の暫定的な解決策としてのみ使用する必要があります。
新しいプロジェクトの場合、将来のアップグレードや移行に関する問題を回避するために、ProtoStream マーシャリングのみを使用することを強く推奨します。
デシリアライズ許可リスト
Red Hat では、多様性を受け入れる用語の使用への取り組みに努めており、Java クラスのシリアル化を設定する際に使用するホワイトリストという用語を許可リストに変更しています。
Data Grid 8.1
<cache-container> <serialization> <white-list> <class>org.infinispan.test.data.Person</class> <regex>org.infinispan.test.data.*</regex> </white-list> </serialization> </cache-container>
Data Grid 8.2
<cache-container> <serialization> <allow-list> <class>org.infinispan.test.data.Person</class> <regex>org.infinispan.test.data.*</regex> </allow-list> </serialization> </cache-container>
JBoss marshalling
Data Grid 7 では、JBoss Marshalling がデフォルトのマーシャラーです。Data Grid 8 では、Proto Stream マーシャリングがデフォルトです。
Java シリアル化を使用するクライアント要件がある場合は、JBoss Marshalling の代わりに JavaSerializationMarshaller
を使用する必要があります。
Data Grid 8 への移行中に一時的な解決策として JBoss Marshalling を使用する必要がある場合は、以下を実行します。
埋め込みキャッシュ
-
infinispan-jboss-marshalling
依存関係をクラスパスに追加します。 次に、
JBossUserMarshaller
を使用するようにデータグリッドを設定します。<serialization marshaller="org.infinispan.jboss.marshalling.core.JBossUserMarshaller"/>
- Data Grid が逆シリアル化を許可するクラスのリストにクラスを追加します。
リモートキャッシュ
Data GridServer は JBossMarshalling をサポートしておらず、infinispan-jboss-marshalling
モジュールがクラスパス上にある場合、GenericJBossMarshaller
は自動的に設定されなくなりました。
次のように、JBoss Marshalling を使用するように Hot Rod Java クライアントを設定する必要があります。
RemoteCacheManager
.marshaller("org.infinispan.jboss.marshalling.commons.GenericJBossMarshaller");
hotrod-client.properties
infinispan.client.hotrod.marshaller = GenericJBossMarshaller
関連情報