Momentoでファイルをキャッシングしてみる

2022.07.01

Momentoはサーバーレスキャッシングサービスです。

プロビジョニング、スケーリングなどの管理を気にせずすぐにキャッシュを利用できるサービスで、超高速のパフォーマンスを提供してくれるとのことです。

サーバーレスフレンドリーなキャッシュとも謳っており、サーバーレスなテクノロジーを採用しているアプリケーションと相性が良さげです。

現在、いろんな実験の場と称して作成しているサーバーレスアプリケーションのファイルアップロードフォームの流れが、

  1. ファイル以外の情報(名前、タグ等)をAPIに送信して登録(APIGateway + Lambda)
  2. S3のpre-signed-urlを取得
  3. ファイルを2で取得したURLにアップロード

というものになっていました。なぜこうなったのかは覚えてはいません。

ファイル自体はS3に一旦格納されて、それをトリガーにファイルの情報を取得してDBに登録したり、字幕を作ったりしています。

S3にアップロードするというのをMomentoに置き換えることできるんじゃ? と思ったのでタイトルのファイルキャッシュをやってみようと思った次第です。

  1. アップロードフォームにセットされた内容を全てMomentoにキャッシュ
  2. 既存のAPIGateway + LambdaのAPIでMomentoのキャッシュを取得して、後続の処理を行なってもらう

この流れにしたらもっと楽にならんだろうか? と。Lambdaの数も減らせるんではなかろうか。

やってみる

懸念点

アップロードフォームは動画ファイルを扱うもので、ファイルサイズは512MBまでOKとしているが、 Momentoでこのサイズを書き込みできるのかどうか?

という懸念があります。

前提

  • Momentoのアカウントを作成
  • 初回セットアップ

現状、クライアントツールからできかアカウントを作成できないようです。

Getting Started を参照し、セットアップを行なっておきます。

momentoのクライアントツール

また、こちらのブログも参考になります

ファイルのキャッシング

.NET, Go, Java, JavaScript. Python, Rust, CLI(MacOS/Linux が現在サポートされていますが、今回はJavascriptを使用しています。

client-sdk-javascript

ただし、JsのSDKはExperimental(実験的なもの)らしいので今後変わる可能性もあります

cacheをセットするためには、setメソッドを使用しますが、3つ目の引数に保存したい値を与えます。

momento.set('test-cache-name', 'test-key', 'test-value');

第3引数の型は[]Byteなので、ファイルのバイナリをここにセットすれば良さそう。

const cacheName = "uploaderCache";
const cacheKey = "uploadFile";

const buffer = fs.readFileSync("<<file_to_path>>");
const filebytes = Uint8Array.from(buffer);

await momento.set(cacheName, cacheKey, filebytes);

const getResp = await momento.get(cacheName, cacheKey);
console.log(getResp)

このサンプルスクリプトを実行してみる。

2MBのファイルの場合

<br />GetResponse {
  textDecoder: TextDecoder { encoding: 'utf-8', fatal: false, ignoreBOM: false },
  status: 'HIT',
  message: undefined,
  body: Uint8Array(2059249) [
      0,   0,   0,  20, 102, 116, 121, 112, 113, 116,  32,  32,
      0,   0,   0,   0, 113, 116,  32,  32,   0,   0,   0,   8,
    119, 105, 100, 101,   0,  31,  46, 248, 109, 100,  97, 116,
      0,   0,   0,  30,   6,   5,  26,  71,  86,  74, 220,  92,
     76,  67,  63, 148, 239, 197,  17,  60, 209,  67, 168,   1,
    255, 204, 204, 255,   2,   0, 162, 220, 189, 128,   0,   0,
     77,  22,  37, 184,  32,   1, 143,   1,  18, 153,  34, 223,
    255, 224, 139,  75, 114, 193,  43, 116,  89, 112,  47,  14,
     78, 214, 153,  84,
    ... 2059149 more items
  ]
}

書き込んだ情報を取得できました。

5MBのファイルの場合

failed to get from cache LimitExceededError: 8 RESOURCE_EXHAUSTED: Received message larger than max (5242887 vs. 4194304)
~~~
~~~

と、ここでエラーが。上限があるようです。

4194304バイトまでなのか。

最後に

Momentoを使ってファイルの中身をキャッシュすることはできますが、現状では上限値があることがわかりました。

大きいサイズのファイルアップロードの一時保存先として活用できないかと考えていましたが、現状だと厳しそうですね。 今後上限が増えたりしたら使えないかまた考えていこうかなと。

参考