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にアクセスしましょう。
アカウントがまだないならここでSignupしてログインします。
ログインしたら、キャッシュ一覧からキャッシュ作成を選択し、
キャッシュ名を記述してクラウドプロバイダーとリージョンを指定します。
次に、トークンのページにアクセスして、
先ほど作成したキャッシュのアクセス権限を持つ
Fine-Grained Access Tokenを生成します。
「トークンを生成する」ボタンをクリックするとトークンが生成されるので、
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をやってみました。
速さとデータサイズはトレードオフになっているので、
要件にあったほうをつかいましょう。