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

新しいインクリメントAPIを使用して統計情報を向上させます

リアルタイムのカウントとレート制限がかつてないほど簡単になりました。

アレン・ヘルトン
著者

Share

Momentoは最近、辞書、リスト、セット、ソートされたセットなど、新しいキャッシュ可能なコレクションデータ型を次々と発表しています。これらのデータ型は、Momento Cacheの古典的なgetとsetの機能に加えて、非常に大きな価値を追加し、私たちのゲーム、Acorn Huntを構築するために使用している素晴らしい新しい実用的なユースケースを開きます。これらの使用例には、プレイヤーのメタデータを保存する辞書、各ゲームでユニークなプレイヤーのリストを保存するセット、ゲーム内のチャットを管理するリストなどがあります。

その上、Sorted Setsでリーダーボードを構築し、複雑なロジックを書くことなく、個々の選手のスコアをハンズフリーで追跡できるようにしました。

本日、Acorn Huntのユースケースを拡張し、より多くの機能を可能にする新機能、Increment APIを発表します。

何ができるのですか?

この関数は、数値を指定された量だけ増加 (または減少) させ、その結果を返します。表面的にはそう見えないかもしれませんが、なぜこれがMomento Cacheにとって大きな意味を持つのかを説明しましょう。

私たちのリモート集中型キャッシュは、同じリソースに対して同時に複数のリクエストが来るような分散システムで使用するために構築されています。このため、2つの呼び出し元が同時に同じリソースを更新しようとすると、問題が発生する可能性があります。

例えば、「Acorn Hunt」では、ゲーム中に全プレイヤーが集めたどんぐりの総数を更新する必要があります。2人のプレーヤーが同時にどんぐりを集めた場合、ソフトウェアのワークフローが現在のスコアを取得し、(アプリケーション・メモリに)ポイントを追加し、更新された値を上書きして保存するというものであれば、間違ったスコアになってしまうかもしれません。その間に別の更新が保存されていたらどうでしょうか?

どんぐりハンターの諸君、恐れることはありません!IncrementAPIを使えば、この問題を完全に回避することができます。現在のスコアを取得して更新する代わりに、このAPIは単純に変更量を表す値を受け取り、それを適用して結果の数値を返します。エラーやデバッグの頭痛の種はありません。
「ただ動く」APIコールです。

インクリメントAPIで何ができますか?

私たちの新しいインクリメント機能には、多くの良い使用例があります。カウンタやレートリミッタを必要とするどんなシナリオも、この新機能で扱うことができます。Acorn Huntの実例を見てみましょう。

試合統計の追跡

先に述べたように、私たちはこの新しい機能を使って、特定のゲームで集まったどんぐりの数などの統計情報を追跡しています。この数字はゲームの全プレイヤーによって更新されるので、APIは得点リソースの競合をなくし、常に正しいことを保証します。

提供された値でスコアを更新するエンドポイントを想像してみてください。


#
# POST / games / { gameId } / points
#
def lambda_handler(event, context):
momento = getCacheClient();
gameId = event['pathParameters']['gameId']
body = json.loads(event['body'])
response = cache_client.increment('acorns', gameId, body['points'])
return {
    'statusCode': 200,
    'body': json.dumps({ 'score': response.value })
}
}

インクリメント・コールの優れた点は、整数であれば正負を問わずどんな数値でも指定できることです。つまり整数です!小数点以下には対応していません!

より優れたレートリミッター

ソートされた集合に関する投稿で、私はAcorn Huntにおける超能力の使用率を制限するユースケースを提供しました。それは技術的にはソートされたセットで動作するが、インクリメントAPIはよりクリーンで軽量なソリューションです。レート制限エンドポイントの実装を考えてみましょう:

#
# DELETE / games / { gameId } / super- ability
#
def lambda_handler(event, context):
momento = getCacheClient();
gameId = event['pathParameters']['gameId']
username = event['requestContext']['authorizer']['username']
response = cache_client.increment(f'{gameId}-super-abilities', username, -1)
if (response.value < 0):
    return {
        'statusCode': 409,
        'body': json.dumps({ 'message': 'Out of super-ability uses' })
    }
else:
return {
    'statusCode': 200,
    'body': json.dumps({ 'remaining': response.value })
}
}

このエンドポイントは、プレーヤーの能力カウントを1デクリメントし、負の数が返されるたびにエラーをスローします。以前のものよりずっとシンプルなソリューションです!

Ready to Build?

本日より、Increment APIがPython SDKで利用可能になりました。APIコールひとつで、統計トラッキング、レート制限、カウントなど、想像しうるすべてのことを始められます。

Pythonユーザーではありませんか?ご期待ください。Node.js、.NET、Java、PHP、Ruby、Go、RustのSDKがまもなくサポートされます!

インクリメントAPIのクールな使用例をお持ちですか?Discordで共有してください!私たちはあなたが作ったものを見て、あなたが思いついたアイデアを解決する手助けをしたいと思います。

Share