ソフトウェア向けにキャッシュを提供してくれるSaaSの「momento」を試してみた

momentoというキャッシュ機能を提供してくれるSaaSをトライアルさせて頂く機会があったので使い方や使用感をまとめます。
2022.03.16

はじめに

おはようございます、加藤です。 momentoというキャッシュ機能を提供してくれるSaaSをトライアルさせて頂く機会があったので使い方や使用感をまとめてみます。

momentoについて

前述のとおり、momentoはキャッシュ機能を提供してくれるSaaSで下記の言語をサポートしています。

CLIで試す

まずはCLIで試してみましょう。

インストールから初期設定まで行います。

brew tap momentohq/tap
brew install momento-cli

momento configure
# Token: << トークンを入力します。
# Default Cache: example-cache << デフォルトで使用するキャッシュサーバーを指定します。
# Default Ttl Seconds [600]: 60 << レコードのデフォルトTTLを設定します。検証なので、短い方が色々便利かと思い60秒にしました。
[2022-03-16T09:09:16Z INFO  momento::commands::cache::cache_cli] creating cache...
[2022-03-16T09:09:17Z INFO  momento::commands::configure::configure_cli] default cache successfully created

ヘルプを見てみます。

momento --help
momento 0.11.8
CLI for Momento APIs

USAGE:
    momento [OPTIONS] <SUBCOMMAND>

OPTIONS:
    -h, --help       Print help information
    -V, --version    Print version information
        --verbose

SUBCOMMANDS:
    account      Manage Accounts
    cache        Cache Operations
    configure    Configure Momento Credentials
    help         Print this message or the help of the given subcommand(s)

cacheサブコマンドのヘルプを見てみます。

キャッシュサーバーに対するコマンドとレコードに対するコマンドが混在しています。キャッシュサーバーおよびレコードという用語はmomento公式のモノではなく私が便宜上使っている用語なのでご注意ください。

  • キャッシュサーバー
    • create
    • list
  • レコード
    • get
    • set
    • delete

各コマンドの使い方はmomento cache $SUBCOMMAND --helpを実行すると見ることができます。

momento cache --help
momento-cache
Cache Operations

USAGE:
    momento cache [OPTIONS] <SUBCOMMAND>

OPTIONS:
    -h, --help       Print help information
        --verbose

SUBCOMMANDS:
    create    Creates a Momento Cache
    delete    Deletes the cache
    get       Gets item from the cache
    help      Print this message or the help of the given subcommand(s)
    list      Lists all momento caches
    set       Stores a given item in cache

set/get操作を行ってみましょう。また、TTL経過でキャッシュが消えることを確認します。

momento cache set --key test --value value
# [2022-03-16T09:28:15Z INFO  momento::commands::cache::cache_cli] setting key: test into cache: example-cache
# [2022-03-16T09:28:16Z INFO  momento::commands::cache::cache_cli] set success
momento cache get --key test
# [2022-03-16T09:28:30Z INFO  momento::commands::cache::cache_cli] getting key: test from cache: example-cache
# value

# 60秒待つ

momento cache get --key test
# [2022-03-16T09:30:03Z INFO  momento::commands::cache::cache_cli] getting key: test from cache: example-cache
# [2022-03-16T09:30:04Z INFO  momento::commands::cache::cache_cli] cache miss

Lambda上で試す

こんな感じのLambda関数を東京リージョン書いて、momentoの東京リージョンに対してset/getの速度を測定してみます。

import 'source-map-support/register';
import {SimpleCacheClient} from '@momento/sdk';
import {performance} from 'perf_hooks';

const MOMENTO_AUTH_TOKEN = process.env.MOMENTO_AUTH_TOKEN!;
const CACHE_NAME = process.env.MOMENTO_CACHE_NAME ?? 'stress-test';
const DEFAULT_TTL = 600;

const client = new SimpleCacheClient(MOMENTO_AUTH_TOKEN, 60);

const write = async (key: string, value: string): Promise<number> => {
  const startTime = performance.now();

  await client.set(CACHE_NAME, key, value);

  const endTime = performance.now();

  return endTime - startTime;
};

const read = async (key: string): Promise<number> => {
  const startTime = performance.now();

  await client.get(CACHE_NAME, key);

  const endTime = performance.now();

  return endTime - startTime;
};

export async function handler() {
  await client.createCache(CACHE_NAME);

  console.log(
    `${await write('my-key', 'my-value')}ms write, ${await read(
      'my-key'
    )}ms read`
  );

  await client.deleteCache(CACHE_NAME);
}

1回目の書き込みだけが極端に遅かったですが(コールドスタート?)3〜6[ms]でset/getができました。

回数 write[ms] read[ms]
1 25.351194000104442 5.297620000084862
2 4.601006999844685 3.717852999921888
3 4.222333000041544 4.09969100006856
4 5.148039999883622 3.6392359999008477
5 4.5207320000045 3.82848499994725

あとがき

ゼロコンフィグで簡単に数ms単位でレスポンスができるキャッシュ機能が利用できるので、使いどころが色々とありそうです。AWSだとCloudFront FunctionsやLambda@Edgeでデータを共有したいときに使えそうだなと思いました。 また、最近はSaaSで特定のイベントをトリガーに任意のスクリプトを実行できるモノもあるので、そういったシチュエーションでデータの共有のために活用することもできそうですね。

以上でした。