Deno と Node.js から momento を使ってみる

momento というサービスを最近見かけました。
世界初のサーバーレスキャッシングサービスと謳っています。

Deno Deploy から使用するキャッシュとして都合よく使えそうなのでこちらの利用をトライしてみます。
上手くいかなかったので、最終的にはNode.jsでトライしています。

参考

momento 導入

momento の導入をするには、CLI からユーザー登録をする必要があります。

1
2
3
4
5
6
7
8
9
10
11
12
$ apt-get install wget
$ wget https://github.com/momentohq/momento-cli/releases/download/v0.21.1/momento-cli-0.21.1.linux_x86_64.tar.gz

$ tar -xvf momento-cli-0.21.1.linux_x86_64.tar.gz
$ ls ./target/release
momento

$ echo "export PATH=\${PATH}:/usr/src/app/target/release" >> ~/.bashrc
$ source ~/.bashrc

$ which momento
/usr/src/app/target/release/momento

ユーザー登録

引き続き、ユーザー登録していきます。

1
2
3
$ momento account signup aws --email hogehogehoge@hoge.com  --region ap-northeast-1
[2022-08-06T18:38:28Z INFO momento::commands::account] Signing up for Momento...
[2022-08-06T18:38:38Z INFO momento::commands::account] Success! Your access token will be emailed to you shortly.

少し待っていると、メールが届きます。

トークンと、簡単な CLI コマンドのサンプルが記載されていました。

CLI で操作

CLI に届いたトークンを設定します。設定周りは、デフォルト値です。

1
2
3
4
5
$ momento configure
Token: <届いたトークンを入力>
Default Cache [default-cache]: # <== デフォルト値そのままで使用
Default Ttl Seconds [600]: # <== デフォルト値そのままで使用
[2022-08-06T18:44:28Z INFO momento::commands::configure::configure_cli] default-cache successfully created as the default with default TTL of 600s

試しに、データの登録/取得/削除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# キャッシュの確認
$ momento cache list
default-cache

# データ登録と参照
$ momento cache set --key key1 --value value1
$ momento cache get --key key1
value1


$ momento cache delete --name default-cache
$ momento cache list
# 削除したので何も返さない

# キャッシュを再作成
$ momento cache create --name store
$ momento cache list
store

# デフォルトのキャッシュが消えたので --name store の設定が必要になった
$ momento cache set --name store --key key1 --value value1

# デフォルトのキャッシュを再設定
$ momento configure
Token [****]:
Default Cache [default-cache]: store # <== 作成したstore を設定
Default Ttl Seconds [600]:
[2022-08-06T19:00:50Z INFO momento::commands::configure::configure_cli] store as the default already exists

# --name store の設定が不要になった
$ momento cache set --key key2 --value value2

# 個別のキーの削除はできない様子のため、すぐにキーを消したいならたぶんこうなる
# ttl に 0 は設定できなかった
$ momento cache set --key key2 --value "" --ttl 1

Deno から呼び出してみる

以下のコードで接続確認を行いました。がエラーに。

momento_connect.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import "https://deno.land/std@0.150.0/dotenv/load.ts";
import {
SimpleCacheClient,
CacheGetStatus,
} from "https://esm.sh/@gomomento/sdk?keep-names";

const auth_token = Deno.env.get("MOMENTO_AUTH_TOKEN");

const ttl = 60;
const name = "store";

const client = new SimpleCacheClient(auth_token, ttl);
// エラー発生
// Uncaught TypeError: jt.pino is not a function
// at new PinoLogger (https://esm.sh/v90/@gomomento/sdk@0.14.3/deno/sdk.kn.js:2:3430)
// at getLogger (https://esm.sh/v90/@gomomento/sdk@0.14.3/deno/sdk.kn.js:2:3282)
// at new SimpleCacheClient (https://esm.sh/v90/@gomomento/sdk@0.14.3/deno/sdk.kn.js:2:21823)
// at <anonymous>:7:16

console.log(client);

const setResult = await client.set(name, "key1", "value1");
console.log(setResult);

const getResult = await client.get(name, "key1");
console.log(getResult);

esm.sh から取得したものが悪いのかとも思ったのですが、調べてみるとエラーになっている Pino が、is not a function というエラーを吐くのは前から起きていそう

node で呼び出してみる

仕方が無いので、node.js から呼び出ししてみます。

momento_connect.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import "dotenv/config";
import { SimpleCacheClient, CacheGetStatus } from "@gomomento/sdk";

const auth_token = process.env.MOMENTO_AUTH_TOKEN;
const ttl = 60;
const name = "store";

const client = new SimpleCacheClient(auth_token, ttl);

const setResult = await client.set(name, "key1", "value1");
// => SetResponse {
// textDecoder: TextDecoder { encoding: 'utf-8', fatal: false, ignoreBOM: false },
// message: undefined,
// value: Uint8Array(6) [ 118, 97, 108, 117, 101, 49 ]
// }
console.log(setResult);
if (setResult.status !== CacheGetStatus.Miss) {
console.log(setResult.text());
// => value1
}

const getResult = await client.get(name, "key1");
console.log(getResult);
// => GetResponse {
// textDecoder: TextDecoder { encoding: 'utf-8', fatal: false, ignoreBOM: false },
// status: 'HIT',
// message: undefined,
// body: Uint8Array(6) [ 118, 97, 108, 117, 101, 49 ]
// }

if (getResult.status !== CacheGetStatus.Miss) {
console.log(getResult.text());
// => value1
}

const getResultMiss = await client.get(name, "key2");
console.log(getResultMiss);
// => GetResponse {
// textDecoder: TextDecoder { encoding: 'utf-8', fatal: false, ignoreBOM: false },
// status: 'MISS',
// message: 'Item not found',
// body: undefined
// }

if (getResultMiss.status !== CacheGetStatus.Miss) {
console.log(getResultMiss.text());
}

momento に node.js からアクセスできました。


momento を触ってきましたが、残念ながら当初目的の Deno から使うことはできませんでした。
動作自体は高速ですし、ぜひ運用してみたいところです。

ではでは。