MongoDBアトラスをシームレスにキャッシュ(素晴らしい自動化!)。

キャッシングでMongoDBアトラスで高速化します。

前回は、DynamoDBのレイテンシを削減する上で、Momento CacheがDAXを凌駕することを紹介した。今日は、MongoDB Atlasを使ったアプリケーションをシームレスにキャッシュする方法を紹介します。わずか1行のコードで、レイテンシを元の1/3以下に削減した方法をご覧ください。

オートマジック・キャッシング

キャッシュを追加するには、コードをリファクタリングして、キャッシュにデータを入力したり、キャッシュにクエリを実行したりする必要があります。Momento Cacheはその摩擦を取り除きます。この例では、よく使われる Mongoose ODM を拡張して、findcountdistinct クエリの値を自動的にキャッシュするようにしました。コード変更なしで自動キャッシュ!まるで魔法のようです!

この拡張バージョンの Mongoose を使うと、アプリケーションが MongoDB に問い合わせるたびに、まず Momento をチェックし、そのエントリが存在しない場合は MongoDB から結果を取得し、その結果を Momento Cache に保存して次の問い合わせに備えます。

Lambda関数の中にあるこのサンプル・アプリケーションでは、自動キャッシュを有効にするために拡張関数を1回呼び出すだけです(これはデフォルトでオンに変更することもできます)。

import { Context, APIGatewayProxyEventV2 } from 'aws-lambda';
import { Schema, model, connect } from 'mongoose';
import wrapWithMomento, { setCaching } from './wrap-with-momento';

// ... set up the mongoose models

wrapWithMomento(); // the cache wrapper here adds the Momento caching to mongoose

export const getLeaders = async (game: string) => {
    return await Player.find().where('game').equals(game).sort({ score: 'desc', name: 'asc' }).limit(20);
};

export const handler = async (event: any, context: Context) => {
    await connect(`${process.env.MONGODB_URI!}/${process.env.COLLECTION_NAME}`, { connectTimeoutMS: 1000 });

    // ... read the game from the HTTP request

    const start = new Date();
    const result = await getLeaders(game);

    return { elapsed: (new Date()).getTime() - start.getTime(), game, result };
};

上のコードとキャッシュなしのバージョンの唯一の違いは、自動キャッシュをオンにするwrapWithMomento()の呼び出しです。

結果

キャッシュされた読み込みとキャッシュされていない読み込みの結果を見るために、20RPSでサンプルアプリケーションを呼び出す2つ目のLambda関数を構築しました。1つはMongoDB Atlas Sharedに対して直接、もう1つはMomento Cache内に結果をキャッシュする拡張Mongooseクライアントを使用しました。

12時間のテスト期間中、キャッシュされていないMongoDB Atlas Sharedの平均リクエストレイテンシは9.2msで、Momentoの平均は2.8msでした。

これでよし。たった1行のコードでレイテンシを1/3に減らすことができました!もしあなたのアプリケーションでMongooseを使っているなら、同じことができます!

Githubにある私たちのレポで試してみてください!他の言語を使っている場合は、同じ原理で自動的にキャッシュすることができます。私たちのDiscordにどの言語を表示させたいかお知らせください!