[Momento Cache] compression機能をつかってデータのGet/Setをしてみる [Rust]

2023.10.13

Introduction

Momentoはこのblogで何度か紹介している、
クラウドネイティブな各種サーバレスサービスです。
そして、このあたりにもあるように、
いろいろなプログラミング言語でSDKが提供されています。

その中でRust用SDKも用意されているのですが、
v0.32でデータのSet/Get時にデータを圧縮する機能が実装されていました。

おもしろそうなので、Rust用SDKでMomento Cache(データキャッシュ機能)の
compress機能を試してみます。

Environment

  • MacBook Pro (13-inch, M1, 2020)
  • OS : MacOS 13.5.2(Orb:ubuntu23)
  • Rust : 1.72.1

Setup

Momentoの設定

まずはMomentoキャッシュと認証トークンを作成します。
Momento Consoleにアクセスしましょう。

momento-cloudflare-0

アカウントがまだないならここでSignupしてログインします。
ログインしたら、キャッシュ一覧からキャッシュ作成を選択し、
キャッシュ名を記述してクラウドプロバイダーとリージョンを指定します。

次に、トークンのページにアクセスして、
先ほど作成したキャッシュのアクセス権限を持つ
Fine-Grained Access Tokenを生成します。

momento-cloudflare-3

「トークンを生成する」ボタンをクリックするとトークンが生成されるので、
Auth Tokenを環境変数に設定しておきましょう。

% export MOMENTO_TOKEN="<Auth Token>"

Rust Projectの設定

Cargoを使ってRustプロジェクトを作成します。

% cargo new momento_rust && cd momento_rust

Cargo.tomlに依存ライブラリを追加します。

[dependencies]
momento = "0.32.1"
tokio = { version = "1.18.2", features = ["full"] }

Try

MomentoへアクセスするためにSimpleCacheClientを作成します。

use momento::{CredentialProviderBuilder, SimpleCacheClient, SimpleCacheClientBuilder};

#[tokio::main]
async fn main() {
    let auth_token = String::from("MOMENTO_TOKEN");
    let credential_provider = CredentialProviderBuilder::from_environment_variable(auth_token)
        .build()
        .expect("env var MOMENTO_TOKEN must be set to your auth token");

    let mut cache_client: SimpleCacheClient =
        SimpleCacheClientBuilder::new(credential_provider, Duration::from_secs(30))
            .unwrap()
            .build();
・
・
・
}

クライアントを作成したら、Momentoへのアクセスが可能です。
通常のSet/Getは↓のようになります。

// Set
cache_client
    .set(<キャッシュ名>, <キー>, <値>, None)
    .await
    .unwrap();

// Get
let result_get: Get = cache_client
    .get(<キャッシュ名>, <キー>)
    .await
    .expect("get error!");
let result : MomentoResult<String> = result_get.try_into();

圧縮機能を使ったGet/Set

次に、圧縮処理を行ってからキャッシュをGet/Setする機能を使ってみます。
内部ではzstdクレートを使って圧縮を行っています。
違いはset_with_compression/get_with_decompressionを使うところだけ。

// Set with Compression
cache_client
    .set_with_compression(<キャッシュ名>, <キー>, <値>, None)
    .await
    .unwrap();

// Get with Compression
let result_get = cache_client
    .get_with_decompression(<キャッシュ名>, <キー>)
    .await
    .expect("get error!");
let result : MomentoResult<String> = result_get.try_into()

動作確認と計測

実際にcompressionあり・なしで500KBのデータをSet/Getしてみました。
送受信データを確認してみると、圧縮することで20%ほどサイズが少なくなっています。

送信データ 受信データ 合計
圧縮あり 430KB 441KB 871KB
圧縮なし 518KB 530KB 1.05MB

処理時間も測定。こちらは圧縮なしだと20%ほど速くなります。

Get Set
圧縮あり 116.7ms 123.4ms
圧縮なし 84.1ms 90.8ms

Summary

Momento Rust SDKをつかって圧縮Get/Setをやってみました。
速さとデータサイズはトレードオフになっているので、
要件にあったほうをつかいましょう。