この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
おはようございます、加藤です。 momentoというキャッシュ機能を提供してくれるSaaSをトライアルさせて頂く機会があったので使い方や使用感をまとめてみます。
momentoについて
前述のとおり、momentoはキャッシュ機能を提供してくれるSaaSで下記の言語をサポートしています。
- .NET: https://github.com/momentohq/client-sdk-examples/tree/main/dotnet
- Go(Experimental): https://github.com/momentohq/client-sdk-examples/tree/main/golang
- Java: https://github.com/momentohq/client-sdk-examples/tree/main/java
- JavaScript/TypeScript: https://github.com/momentohq/client-sdk-examples/tree/main/javascript
- Python: https://github.com/momentohq/client-sdk-examples/tree/main/python
- CLI(MacOS/Linux): https://github.com/momentohq/momento-cli
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で特定のイベントをトリガーに任意のスクリプトを実行できるモノもあるので、そういったシチュエーションでデータの共有のために活用することもできそうですね。
以上でした。