We’re sorry we missed you at re:Invent, but we can still meet!

データベース・キャッシュ:DynamoDB Streamsによるヒット率の向上

DynamoDB Streamsを使って、Momento Cacheをさらに良く。

Ellery Addington-White
Author

Share

キャッシュの無効化は難しい問題です!なぜなら、ほとんどのキャッシュの無効化は善意によって、つまり非決定論的に行われるからです。デフォルトでは、ほとんどのキャッシュはTTL(time to live)さえ必要としないため、古くなった値に起因する潜在的で診断しにくいバグが発生します。スタックに意味のある厳密性を追加できるテクニックが2つあります。

1.各PUTの一部としてTTLを要求する-これはMomento Cacheがデフォルトで持っているものです。これは、開発者がどの程度の陳腐化を許容できるかをよく考え、実際に陳腐な値を取得する可能性があることを認識することを促します。
2.最適な無効化とは、自動的かつ確実に行われるものです。このブログでは、DynamoDBのお気に入りの機能(Streams)を使って、DynamoDBから最新のエントリを自動的に無効化してプリフェッチするシンプルなアプローチについて説明します!

すぐに飛び込みたいなら、デモ・レポをご覧ください。

データベース・キャッシュをもっと簡単にしよう

あなたのアプリケーションにMomentoを統合するのに必要なコードは5行だけですが、私たちはそれをさらにスムーズにするために常に努力しています!私たちのAWS V3 JavaScript SDK用ミドルウェアを使えば、たった1行のコードでDynamoDBスタックにMomento Cacheをシームレスに追加できます:

import {NewCachingMiddleware} from '@gomomento-poc/aws-cache-helpers';

const db = DynamoDBDocumentClient.from(new DynamoDBClient({}));
db.middlewareStack.use(NewCachingMiddleware({
    tableName: 'my-ddb-table',
    momentoAuthToken: authToken,
    defaultCacheTtl: 86400,
    cacheName: 'default'
}
));

これは、アプリケーション全体のすべてのGetItem呼び出しにMomento Cacheを統合します。サーバーレスのDynamoDBアクセラレータ(DAX)に最も近いものですが、DAXのような価格タグや運用の負担はありません。2行のコードで、DynamoDBのp999のレイテンシを60%下げることができます。しかし、私たちはもっと良い方法があることを知っていました!

キャッシュの無効化です。DynamoDBのアイテムが(どこからでも)更新された場合、DynamoDB Streamsを使うことで、自動的に古い値を消去したり、DynamoDBの最新の値に置き換えたりすることができるのです!

それでは、DynamoDB Streamsを使ってデータベースのキャッシングを改善しましょう。

DynamoDB Streamsは、データベースの順序付きトランザクションログです。DynamoDBでアイテムを作成、更新、削除すると、そのイベントがDynamoDB Streamsに表示されます。これは、マテリアライズドビューを作成したり、キャッシュをハイドレートするために使用できる強力なツールです。

DynamoDB Streamsを使用してキャッシングを改善することは既知のパターンですが、コードを書くことなく試していただきたかったのです!

ストリームイベントを処理し、Momento Severless Cacheをプロアクティブに更新するStream-Cacherというコンポーネントをシンプルなアーキテクチャに追加しました。

つまり、このような単純なリード・アサイド・キャッシュから移行するわけです:

Stream-Cacher Lambdaを加えた以下のようなアーキテクチャに:

aws-cache-helpersライブラリを使用すると、これを有効にするのが非常に簡単になります。DynamoDB stream lambdaのメインハンドラとしてMomento NewStreamCacheHandlerをドロップするだけで有効にできます。

import { NewStreamCacheHandler } from '@gomomento-poc/aws-cache-helpers';

export const handler = NewStreamCacheHandler({

    tableName: 'my-ddb-table',

    momentoAuthToken: authToken,

    defaultCacheTtl: 86400,

    cacheName: 'default'

});

DynamoDB Streams (とMomento Cache 😊) のおかげで、最小限の労力でほぼリアルタイムのキャッシュ更新ができます。このセットアップの完全なデモはこのリポジトリにあり、AWS CDK DDB CRUDサンプルの上に構築しています。

自分のAWSアカウントで素早くスピンアップするのはとても簡単です。

Share