はじめに
Momento Cache はサーバーレスキャッシュサービスです
Lambda + DynamoDB というサーバーレスの黄金パターンに組み込んだ例があります
Momento にキャッシュがなければ DynamoDB を参照する、 Cache-Aside (キャッシュアサイド) パターンを実装した場合、レイテンシの 60 % を削減できる、としています
日本で Momento Cache を活用した事例としては、北海道テレビの事例などがあります
先日参加した JAWS DAYS 2024 にて Momento の Elixir SDK があることを知ったので、 Livebook から使ってみます
この記事ではキャッシュの作成、キーバリューの登録、取得を実装します
実装したノートブックはこちら
事前準備
サインアップ
先に Momento のアカウントを用意しておきます
素晴らしいことに、試すだけであればクレジットカードの登録は不要です
以下のリンクから Momento にサインアップしましょう
右上の「ログイン」をクリックします
メールアドレス、もしくは Google アカウントか GitHub アカウントでサインアップできます
API KEY の作成
サインアップできると、以下のような画面が表示されます
「Generate API Keys」をクリックしてください
API キーの作成画面が表示されます
試すだけならどこでも問題ありませんが、クラウドプロバイダーに AWS 、リージョンに ap-northeast-1 (東京)を選択します
「Type of key」は左側の「Super User Key」を選択します
下にある「トークンを生成する」ボタンをクリックしてください
API Key が生成されます
後でこの値を使用します
セットアップ
Livebook で新しいノートブックを開き、 Momento の SDK モジュールと Kino をインストールします
Mix.install([
{:gomomento, "~> 0.6"},
{:kino, "~> 0.12"}
])
Hex の momento
モジュールは JavaScript の日付時刻操作ライブラリである Moment.js を Elixir から使うためのものです
https://hex.pm/packages/momento
Momento を使うためのモジュールは gomomento
なので気をつけましょう
Momento.CacheClient
は頻出するのでエイリアスを付けて CacheClient
だけで使えるようにしておきます
alias Momento.CacheClient
クライアントの準備
Momento Cache を操作するためのクライアントを準備しましょう
先ほど取得した API キーを入力するための UI を作成します
api_key_input = Kino.Input.password("API_KEY")
セルを実行するとパスワード型のテキスト入力が表示されるので、 API キーの値を入力します
クライアントの設定を用意します
config = Momento.Configurations.Laptop.latest()
実行結果
%Momento.Config.Configuration{
transport_strategy: %Momento.Config.Transport.TransportStrategy{
grpc_config: %Momento.Config.Transport.GrpcConfiguration{deadline_millis: 5000}
}
}
API キーの値を読み込んで認証情報プロバイダーを作成します
credential_provider =
api_key_input
|> Kino.Input.read()
|> Momento.Auth.CredentialProvider.from_string!()
設定情報、認証情報プロバイダー、TTL(キーバリューを残しておく秒数)を指定してクライアントを作成します
default_ttl_seconds = 60.0
client = CacheClient.create!(config, credential_provider, default_ttl_seconds)
キャッシュの作成
キャッシュ名を設定します
cache_name = "cache"
クライアントとキャッシュ名を指定してキャッシュを作成します
CacheClient.create_cache(client, cache_name)
実行結果
{:ok, %Momento.Responses.CreateCache.Ok{}}
キャッシュの一覧を取得してみます
CacheClient.list_caches(client)
実行結果
{:ok, %Momento.Responses.ListCaches.Ok{caches: [%Momento.Responses.CacheInfo{name: "cache"}]}}
Momento のコンソールの方からも確認してみます
確かに指定した名前でキャッシュが作成されています
ちなみに、すでに存在している名前でキャッシュを作成しようとすると、以下のような結果になります
:already_exists
キーバリューの登録、取得
キャッシュ、キー、バリューを指定して登録します
CacheClient.set(client, cache_name, "foo", "bar")
実行結果
{:ok, %Momento.Responses.Set.Ok{}}
キャッシュ、キーを指定して取得します
CacheClient.get(client, cache_name, "foo")
実行結果
{:ok, %Momento.Responses.Get.Hit{value: "bar"}}
Momento のコンソールでも確認できます
TTLが60秒なので、 60 秒以上経過してからもう一度値を取得すると、実行結果は以下のようになります
:miss
こうなった場合、キャッシュではなく元のデータベースを参照しに行くことになります
まとめ
Elixir 用の SDK を使うことで、 Livebook から簡単に Momento Cache を試すことができました
キャッシュが必要なパターンが出てきたときに是非活用したいですね