2

分散キャッシュから1秒間に数千回オブジェクトをフェッチする必要があるアプリがあります。HazelcastのIMap.get()を使用していますが、これを呼び出すと、オブジェクトの逆シリアル化コードも呼び出されるようです。何度も逆シリアル化するオーバーヘッドを許容することはできません。

バイトの配列ではなく、完全に形成されたオブジェクトをHazelcastに保持させる方法はありますか?

(これをHazelcastメーリングリストに送信したはずですが、Googleグループは投稿を拒否しています。)

4

1 に答える 1

1

あなたの質問に対する簡単な答えはノーです。すべてのアクセスでバイト配列の逆シリアル化を防ぐ方法はありません(1つのマイナーな例外を除いて、以下を参照してください)。

Hazelcastがオブジェクトをクラスター内の他のノードと共有するには、それらのオブジェクトのシリアル化されたバージョンをバイトの配列として渡す必要があります。IMap.get(key)したがって、 Hazelcastを呼び出すたびに、オブジェクトを所有するノードからオブジェクトを表すバイトの配列を取得し、それを逆シリアル化して、オブジェクトの複製コピーを作成します。これを回避する方法はなく、クラスター内の複数のノード間で一貫性を保つ分散マップがあります。

マイナーな例外が1つあります。デフォルトでは、IMapsは、要求元ノードが所有するオブジェクトの実際の逆シリアル化されたオブジェクトをキャッシュします。これは、cache-value構成パラメーター(デフォルトはtrue)で設定されます。ただし、オブジェクトを変更した後で明示的に(または、、、、またはそのバリエーションの1つ)を実行しない限り、そのキャッシュされた値への変更は他のノードに分散されません。Hazelcastドキュメントのセクション18.1、アイテム2を参照してください。IMap.put(key, value)replaceset

マップを有効near-cacheにすると、所有ノードからバイト配列を取得する(つまり、ネットワークを介して所有ノードから要求ノードにバイトを転送する)コストを節約できます。これは、要求ノードにバイトをキャッシュするためですが、逆シリアル化は引き続き行われます。すべてのアクセス。これにより、一貫性を犠牲にしてパフォーマンスが向上します。頻繁に変更されないオブジェクトを取得する場合に便利です。

于 2013-01-18T23:22:03.113 に答える