🏄‍♂️

【Roblox】MemoryStore 概要編

に公開

はじめに

Robloxにはエクスペリエンス内においてデータの保存や共有ができるサービスがいくつか存在します。
もっともよく目にするのはDataStoreだと思いますが、今回は同じくデータの保存や共有ができるサービスの一つであるMemoryStoreの概要について紹介します。

今回は概要編なので細かいコードなどは載せていませんが、今後MemoryStoreのデータ構造ごとに深堀した記事を順次公開する予定です!

Roblox バージョン: 0.661.0.6610708

MemoryStoreの概要

MemoryStoreはエクスペリエンス内のすべてのサーバーからデータの保存や共有ができます。
DataStoreのように利用ができますが、さらに高スループットで低レイテンシに動作します。

DataStoreとの大きな違いは、MemoryStoreには保存したデータごとに有効期限があることです。
後述しますが、この期限が切れた場合はデータは自動的に削除されます。

このことから、永続的に保存する必要があるデータはDataStoreを使用し、他のサーバーなどで復元ができ頻繁に変更されるようなデータや一時的に保存したいデータを利用する際はMemoryStoreの方が優れていると言えます。

MemoryStoreのデータ構造は、SortedMapQueueHashMapと3種類あります。
SortedMapでは、ソートキーを利用して順序を保持することができます。
Queueでは、先入れ先出しの順序でデータを保持できます。これは優先度を設定することも可能です。
HashMapでは、SortedMapやQueueのような順序をつけずにデータを保持します。

用途に応じて、使用するデータ構造を変更できることもMemoryStoreの強みです。

MemoryStoreの特徴

MemoryStoreの特徴を詳しく見ていきたいと思います。

有効期限

MemoryStoreで保持するデータは、最大45日の有効期限があります。
これはデータごとに秒単位で設定できます。
有効期限が過ぎたデータは自動的に削除されるので注意が必要です。

データごとの有効期限を可能な限り短く設定することで、不要なデータがクリーンアップされメモリ使用量の割り当てがオーバーすることを防ぐことができます。

制限

MemoryStoreには、エクスペリエンスが消費できるメモリサイズ、APIリクエスト数、データ構造に対するサイズ制限が存在します。
これらが制限に達している場合、処理は失敗するので注意が必要です。

1. エクスペリエンスで消費できるメモリクォータ

メモリクォータ(Memory Quota)はエクスペリエンス毎にMemoryStoreにおいて消費できるメモリの合計量です。
これは固定値ではなく、下記式に応じてユーザー数によって変化します。

64KB + 1KB * [ユーザー数]

消費できるメモリクォータには8日間のトレースバック期間が設けられています。
つまり、過去8日間の最大接続数が上記式のユーザー数に割り当てられます。
これにより、週末にトラフィックがピークになり月曜日に急激に減少し突然制限に達するという現象を防いでいます。

有効期限を長くしてメモリサイズを抑えるか、有効期限を短くしてフルサイズに近いサイズを使用するか、ニーズによって決めましょう。
可能な限り、有効期限を短くすることで制限にかからないようにしましょう。

2. APIのリクエスト数

APIのリクエスト数にも制限があり、下記の式で変化します。

1分あたり 1000 + 100 * [現在のユーザー数]

基本的にはAPI呼び出し1回につき上記リクエスト数を1つ消費しますが、一部例外があります。
下記は例外のAPIの表です。

API名 消費するリクエスト数
MemoryStoreSortedMap:GetRangeAsync() 返されるアイテム数に応じて変化する。空のアイテムを返す場合でも1つ消費する。
MemoryStoreQueue:ReadAsync() 返されるアイテム数に応じて変化する。読み取り中は2秒ごとにリクエスト数を消費する。waitTimeout パラメーターを使用して最大読み取り時間を指定することも可能。
MemoryStoreHashMap:UpdateAsync() 最低2つのリクエスト数を消費する。(キーを読み取り中に別サーバーで変更があった場合、最新のアイテムを再度読み込むので2つ以上リクエスト数を消費する場合もある。)
MemoryStoreHashMap:ListItemsAsync() [スキャンされたパーティションの数] + [返されたアイテム数] 分消費する。

3. データ構造のサイズ制限

単一のSortedMapやQueueではサイズ制限があります。

最大アイテム数: 1,000,000
最大合計サイズ(ソートされたマップのキーを含む): 100 MB

SortedMapでは上記に加えさらに制限があります
キーのサイズ: 128 文字
設定するデータのサイズ: 32KB
ソートキーのサイズ: 128 文字

HashMapでは下記の制限があります。
キーのサイズ: 128 文字
設定するデータのサイズ: 32KB

HashMapでは設定するデータの個数に関して、APIのリクエスト数とエクスペリエンスで使用できるメモリサイズの制限に該当しない範囲であれば制限はありません。

4. パーティションごとの制限

MemoryStore APIは、ストレージを細分化したパー​​ティション毎にデータを保存します。
これに関して、Robloxが自動で管理するので自分で操作することはないです。

SortedMapとQueueはデータ構造1つに対して単一のパーティションを使用します。
HashMapは全てのパーティションに分散されます。

パーティション毎に制限があるため、SortedMapとQueueは制限にかかりやすく、HashMapは分散されているため制限にかかりにくいです。

パーティションの仕組み上、ソートや先入れ先出しを行わずキーの数が1000を超える場合はHashMapを利用しましょう。

詳しくは下記ガイドをご覧ください。
https://create.roblox.com/docs/cloud-services/memory-stores/per-partition-limits#limits

Studioでのデバッグ

MemoryStoreのデータはRoblox StudioとPlayerで操作する本番環境と分離しています。
そのため、Roblox Studioでデータを変更しても本番環境では反映されません。

前述した制限もRoblox Studioと本番環境は分離しています。
ただ、Roblox Studioのテスト環境では本番環境より人数を集めることができなかったり、内部的にアクセスと権限を確認するために実行される追加のチェックが走ったりするので、レイテンシが若干高くなり、エラー率が高くなることもあるようです。

Roblox StudioでMemoryStoreを扱う際は上記点に注意しましょう。

ダッシュボードから確認

MemoryStoreのメモリ使用量とAPIリクエストに関するリアルタイムチャートを確認したい場合は、DataStore同様ダッシュボードから確認できます。
これは自身のアカウントにAnalyticsを閲覧する権限が無いと確認することができないので注意です。

確認できる項目としては、MemoryStoreで使用中のメモリ量や、メモリクォータの推移、APIのリクエスト数を結果と共に表示することなどができます。

これらはRoblox Playerでの環境の結果のみ表示されます。
Roblox Studioでのテスト環境の結果は反映されないので注意しましょう。


ダッシュボード > Monitoring > Memory Stores から確認できる


メモリ使用量やメモリクォータ推移が見れる


HashMapのSetAsyncの結果がSuccessの推移

詳しくは下記ガイドをご覧ください。
https://create.roblox.com/docs/cloud-services/memory-stores/observability

まとめ

  • MemoryStoreはエクスペリエンス内のすべてのサーバーからデータの保存や共有ができ、DataStoreと比べ高スループットで低レイテンシに動作する。

  • セッションを挟んだデータの保存はDataStore、頻繁に変更されるデータや一時的なデータの保持はMemoryStoreが向いている。

  • MemoryStoreに保存するデータには有効期限があり、これはデータごとに秒単位で設定できる。これは最大で45日であり、超過した場合は自動的にデータが削除される。

  • エクスペリエンスで消費できるメモリクォータは、過去8日間の最大接続を含めた64KB + 1KB * [ユーザー数]で計算される。

  • APIのリクエスト数にも制限があり、1000 + 100 * [現在のユーザー数]で計算される。

  • データ構造(SortedMap、Queue、HashMap)毎にキーサイズなどの制限がある。

  • MemoryStoreのデータはパーティション毎に内部で管理され、この仕組み上ソートや先入れ先出しを行わない場合はHashMapを利用したほうが良い。

  • Roblox Studioと本番環境のデータは完全に分離している。

  • Roblox Playerでの本番環境でのMemoryStoreの利用について、ダッシュボードからリアルタイムチャートについて確認することができる。

少し長い記事でしたが、以上がまとめになります。
リーダーボードでのランキングやマッチメイキング機能など使い道はたくさんあると思います。
ぜひMemoryStoreServiceを利用しましょう。

参考

https://create.roblox.com/docs/reference/engine/classes/MemoryStoreService
https://create.roblox.com/docs/cloud-services/memory-stores

ランド・ホー Roblox開発チーム

Discussion