Momento Node.js SDKで圧縮を使用する
なぜ圧縮なのか?
キャッシュデータが大きな文字列値で構成されている場合、特にJSONのように繰り返し使用される可能性がある場合は、クライアント側の圧縮を有効にすることで、Momentoとの間で転送されるデータのサイズを90%も削減できる可能性があります。 有効にすると、Momento との間で転送するデータのサイズを 90% も削減できます。これにより ネットワークトラフィックとストレージコストの削減により、大幅なコスト削減につながります。
圧縮の有効化
Momento Node.js SDK の get
/set
および getBatch
/setBatch
キャッシュメソッドは圧縮をサポートしています。
圧縮のサポートは、拡張パッケージをインストールすることで提供されます。npmjs.comで入手でき以下の2種類のエクステンションパッケージからお選びいただけます。
- @gomomento/sdk-nodejs-compression - gzipをベースとした、デフォルトで推奨される圧縮拡張子です。
- @gomomento/sdk-nodejs-compression-zstd -
zstd
に基づく、上級ユーザー向けの代替圧縮拡張子です。 パフォーマンスの向上と引き換えに、少し難しいパッケージング構成にも対応しています。
gzip
はnode.jsの標準ライブラリで利用できるので、追加の依存関係は必要ありません。
Momento node.js アプリと同じです。zstd` 拡張機能には、ターゲットプラットフォーム固有のネイティブ依存関係が必要です。
そのため、ビルドの際にターゲットとなるアーキテクチャに適した依存関係が含まれるように設定する必要があります。
私たちのテストでは、Momento キャッシュに保存される典型的な JSON データでは、圧縮率は gzip
と zstd
の間で非常に似ていることがわかりました。
。しかし、非常に大きな値 (100kb 以上) については、 zstd
を使用することで圧縮率が最大 20% 向上し、データの圧縮と展開にかかる時間を最大 20% 短縮することができます。
どの拡張機能が適切かわからない場合は、デフォルトの
@gomomento/sdk-nodejs-compressionパッケージから始めることをお勧めします。
後でzstd
に切り替えることができます。
圧縮を始めるには、まず圧縮拡張パッケージをプロジェクトに追加します:
npm install @gomomento/sdk-nodejs-compression
これをインストールしたら、キャッシュクライアント設定に圧縮ストラテジーを追加して、圧縮を有効にすることができます:
Configurations.InRegion.Default.latest().withCompressionStrategy({
compressorFactory: CompressorFactory.default(),
compressionLevel: CompressionLevel.Balanced,
});
データの圧縮
依存関係がインストールされ、クライアントが設定されていれば、set または setBatch を呼び出すときに compress: true
を指定して、その値を圧縮することができます:
const result = await cacheClient.set(cacheName, 'test-key', 'test-value', {compress: true});
switch (result.type) {
case CacheSetResponse.Success:
console.log("Key 'test-key' stored successfully");
break;
case CacheSetResponse.Error:
throw new Error(
`An error occurred while attempting to store key 'test-key' in cache '${cacheName}': ${result.errorCode()}: ${result.toString()}`
);
}
自動解凍
デフォルトでは、圧縮を有効にすると、SDKは自動解凍も有効にします。つまり
SDK が get
または getBatch
を使用して読み込んだキャッシュ値は、それが書き込まれたときに圧縮されていた場合は自動的に展開されます。したがって
呼び出す際に、圧縮されたデータを扱うように変更する必要はありません。
データを圧縮したいが、SDKに自動的に解凍させたくない場合は、そのように設定することもできます:
Configurations.InRegion.Default.latest().withCompressionStrategy({
compressorFactory: CompressorFactory.default(),
compressionLevel: CompressionLevel.Balanced,
automaticDecompression: AutomaticDecompression.Disabled,
});
自動解凍が無効になっている場合は、get
または getBatch
を呼び出す際に decompress: true
を指定することで、SDK に特定の値を解凍するように指示することができます。
const result = await cacheClient.get(cacheName, 'test-key', {decompress: true});
switch (result.type) {
case CacheGetResponse.Miss:
console.log(`Key 'test-key' was not found in cache '${cacheName}'`);
break;
case CacheGetResponse.Hit:
console.log(`Retrieved value for key 'test-key': ${result.valueString()}`);
break;
case CacheGetResponse.Error:
throw new Error(
`An error occurred while attempting to get key 'test-key' from cache '${cacheName}': ${result.errorCode()}: ${result.toString()}`
);
}
非圧縮データは圧縮設定の影響を受けません。
More Examples
SDKのgithubリポジトリで利用可能な追加の例をいくつか紹介します: