メインコンテンツまでスキップ

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 データでは、圧縮率は gzipzstd の間で非常に似ていることがわかりました。 。しかし、非常に大きな値 (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});
if (result instanceof CacheSet.Success) {
console.log("Key 'test-key' stored successfully");
} else if (result instanceof CacheSet.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});
if (result instanceof CacheGet.Hit) {
console.log(`Retrieved value for key 'test-key': ${result.valueString()}`);
} else if (result instanceof CacheGet.Miss) {
console.log(`Key 'test-key' was not found in cache '${cacheName}'`);
} else if (result instanceof CacheGet.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リポジトリで利用可能な追加の例をいくつか紹介します: