テクノロジーとインフラストラクチャ→キャッシュ階層とデータストレージ
キャッシュ階層とデータストレージ
1)多層キャッシュが必要な理由
キャッシュは「高価な」サブシステム(データベース、外部API、ネットワーク)に行かずに答えへの短いパスです。レイヤリングはロードを分配します:ブラウザ→CDN/edge→アプリケーション層→分散キャッシュ→データベース/ストレージ。目標:P95/P99を削減し、原点をアンロードし、ピークに耐え、よりしっかりとバイトのコストを削減します。
2)キャッシュレベルマップ
1.'Cache-Control'、 'ETag'、 'Last-Modified'、 'stale-while-revalidate'。
2.CDN/Edge: TTL/ключ、 Vary、 Signed URL、 image-resize;階層型/シールド。
3.APIゲートウェイ/サービスメッシュ:安全なGETのための短命の応答キャッシュ。
4.アプリケーション(プロセス内):LRU/LFU、ホットキーのニアキャッシュ、ミリ秒。
5.分散キャッシュ(Redis/Memcached):ダイナミクスのメインレイヤー。
6.DBキャッシュ:Pg/Innodbバッファ、PgBouncer多重化、実体化ビュー。
7.ディスク/オブジェクトストア:事前に実行されたスナップショット、blobキャッシュ(S3+CDNなど)。
原則: "ユーザーに近い、より短いTTLおよびより少ない個人化;データに近いほど、コンシステンシー・ポリシーは豊かになります"
3)キャッシュパターン
Cache-Aside (Lazy):読み込み→MISSでソースから読み込み→キャッシュに入れます。簡単、TTL制御を与えます。
読み取り:アプリケーションは、ソース自体からプルするキャッシュを読み取ります。ポリシーを一元化するのは便利です。
Write-Through:録音はすぐにキャッシュとソースに移動します。より一貫した、しかし記録でより高い。
Write-Back (Write-Behind):キャッシュに書き込みます。ソースは非同期的に更新されます(キュー)。高速、船積みの保証および要求されるidempotency。
Refresh-Ahead: 「top」キーの場合、TTLの有効期限が切れる前に値を更新します。
どこ:ゲームカード/ディレクトリ-キャッシュアサイド/リードスルー;counters/leaderboards-書き込みバック+CRDT/集計;currency/limitディレクトリ-制御されたTTLで読み取ります。
4)キー、区分および命名
「ドメイン:エンティティ:{id}: v{schema}|region={R}|currency={C}|lang={L}」。
実際に答えを変更するもの(地域、通貨、言語、スキーマバージョン)のみをキーに含める。
スキーマバージョニング:互換性のない変更の場合-キーの'vN'を上げ、大量パージを避けます。
プロダクト/テナントによる名前付け:'テナント:{t}:'……-マルチテナントにとって重要です。
「キーの存在」のためのブルームフィルタは、ソースへのトリップを減らすことができます。
5) TTL、新鮮さおよび障害
TTL行列:- 静的(ハッシュドファイル):30-365日+'immutable';
- カタログ/バナー:5-60分+'stale-while-revalidate';
- leadboard/引用語句:2-15秒;
- ディレクトリ(通貨/限度):1-10分。
- 障害イベント:製品を公開します。'→dot key/prefix disabilityを更新しました。
- Tag-based purge: group purges by tag(プロモーション/カタログリリース)。
- Soft-Expiry: TTLの有効期限が切れた後、古いものを'stale'として与え、並行して更新します(SWR/SIE)。
- バージョン管理されたキー>大量パージ:安価で安全。
6)スタンピード、ホットキーと競争
Dogpile/Stampedeの保護:- 単一飛行(要求合体):1人のリーダーがキーを更新し、残りは待ちます。
- TTLジッタ:流出をぼかし、1回限りの崩壊を避けます。
- SWRローカル:ユーザーに期限切れの値を与え、バックグラウンドで更新します。
- 複数の'キー#1へのホットキーのレプリケーション..読み取りで配布されたNスロット
- プロセスメモリ内のニアキャッシュ。
- prewarm/refresh-ahead before picks(トーナメント/マッチ)。
- 重い鍵の簡潔な更新の制限。
7)一貫性とクロスレイヤー
Write-invalidate:ソースに書き込むとき-対応するキー(pub/sub)を同期的に無効にします。
読み取り修復:不一致の場合は、正しい値でキャッシュを更新します。
最終的なvs強い:重要な現金取引は、直接/短いTTLで読み取られます。UIショーケースと統計-最終的に。
CRDT/Aggregators:分散カウンタ/評価用-「マージセーフ」構造(Gカウンタ、ストリーム上のトップK)。
カスケード障害:「ゲーム」を更新すると、カード+リスト+カスタム推奨キャッシュが無効になります。
8)シリアル化、圧縮およびフォーマット
フォーマット:protobuff/MessagePack JSONよりも高速。CDN/ブラウザの場合-Brotliを使用したJSON。
Redisでの圧縮:オブジェクト>1-2 KBに有益ですが、CPUには注意してください。
部分的な応答/オンデマンドフィールド:バイト数が少ない→TTFBとRAMが少ない。
9)プリエンプションポリシーとサイズ
LRU(デフォルト)-安全。LFUは「人気のある」コンテンツに適しています。
key/value size: keep under control(メトリック'avg value size'、 'max')。
1つの製品がキャッシュ全体を「食べる」ことがないように、名前空間/テナントクォータ。
10)保証およびPII/PCI
個人/財務データ-CDN/エッジと共通レイヤーにキャッシュしないでください。トークン/投影を使用します。
クライアント側の暗号化を介してRedisの機密値の暗号化(TTL制御損失に注意して)。
厳密なACLおよびネットワークの分離;プロバイダへの出力用のNAT/IPを修正しました。
11)観測可能性とキャッシュSLO
メトリクス:- Hit Ratio(レイヤーとプレフィックスによる)、Origin Offload。
- キャッシュの前後にTTFB/P95/P99、 レイテンシーRedisを使用します。
- Evictions、 OOM、キースペースのヒット/ミス。
- スタンピード率、リフレッシュ時間。
- 古い役に立ちました。
- ゲームカタログ:ヒット率≥ 85%、 TTFB P95 ≤ 150ミリ秒(エッジ)。
- APIディレクトリ:Revalidation-hit ≥ 60%、 P95 ≤ 200 ms。
- Redis: P99操作≤ 5ミリ秒、毎時1%以下の立ち退き。
12) FinOps: キャッシュ値
$/GB month RAMと$/RPS origin:回収ポイントを計算します。
オフロードと出力:CDN+Redisは、リージョン起源からのアウトバウンドトラフィックを削減します。
画像/WebP/AVIFおよび非正規化は、最大のバイト節約を提供します。
「高価なMISS」:アナリティクス「バイト× MISS ×リージョン」を制限します。
13)例(断片)
13.1単一飛行(擬似コード)によるキャッシュ・アサイド)
python def get(key, ttl, loader):
val = redis. get(key)
if val: return val with single_flight (key): # only one updates val = redis. get (key) # double check if val: return val data = loader () # request to source redis. setex(key, ttl_with_jitter(ttl), serialize(data))
return data
13.2イベント別の障害の公表
json
{
"event": "game. updated",
"game_id": "g123",
"affected": ["catalog:list:region=TR", "game:card:g123:"]
}
消費者はチャンネルを購読し、'DEL'/'PUBLISH'をキー/タグにマッチさせます。
13.3スキーマバージョンとロケールのキー
game:card:v2:id=g123 region=BR currency=BRL lang=pt-BR
14)実装チェックリスト
1.キャッシュレベルマップとTTLマトリックス(静的/半静的/API)。
2.キーの名前:ドメイン、スキーマバージョン、ローカル/地域/通貨、テナント。
3.エンドポイントパターンごとに選択します(ask/read-through/write-through/back)。
4.SWR/SIE、シングルフライト、TTLジッタ対スタンピード。
5.イベント(pub/sub)で無効になり、グループのtag-purge。
6.ピーク前のホットキーとprewarmのニアキャッシュ。
7.フォーマットと圧縮(protobuf/MsgPack、 Brotli)、サイズ制御。
8.LRU/LFUポリシー、名前空間/テナントクォータ。
9.SLO:ヒット率、レイテンシ、立ち退き、古い%、新鮮さの遅れ。
10.セキュリティ:個人用のno-store、トークン化、ネットワーク/ACL。
15)アンチパターン
'no-cache' 「just in case」とTTLの失敗はゼロのオフロードです。
キーには、すべてのクエリ/ヘッダー→カーディナリティ爆発が含まれます。
リリースごとに「total CDN/Redis」を一括パージします。
スタンピードに対する保護の欠如と「トップキー」の1回限りの有効期限。
クォータ/分離なしの単一の一般的なRedis;「ホット」テナントはキャッシュ全体を食べます。
edge/CDNへの個人的な応答のキャッシュ。
鮮度/立ち退きテレメトリー→ブラインドコントロールなし。
16) iGamingコンテキスト/フィンテック: 実用的なノート
リーダーボード/評価:TTL 2-10 s、集計ストリーム+CRDT、クラッシュ時のSWR。
ゲームカタログ/バナー:CDN+Redis;キー:地域/通貨/言語;「promo: update」タグによる無効化。
支払いステータス:書き込みパスにキャッシュはありません。read-短いTTL (≤ 3-5秒)または直接要求。
KYC/AML回答:キャッシュ非PIIデリバティブ(ステータス)、Redisに画像/ドキュメントを保存しないでください。
VIPパス:個別の名前空間/Redisプール、優先サービス。
合計
強力なキャッシュ戦略は、レベルアーキテクチャ、正しい更新パターン、思慮深いTTL/障害、スタンピード抵抗、きちんとしたキーとバージョン、およびオブザビリティとFinOpsです。これらの原則に従うことで、P95/P99の尾を安定させ、ソースへの負荷を軽減し、製品とビジネスにとって最も重要な場所であるミリ秒単位で予測可能なコストを得ることができます。