翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
e コマースアプリケーション用の Amazon ElastiCache (Valkey)
e コマースアプリケーションは、アプリケーションサーバーとデータベース間のインメモリキャッシュレイヤーの利点があります。Valkey を実行する Amazon ElastiCache は、製品カタログエントリ、インベントリ数、検索結果、ユーザーセッションなど、頻繁にアクセスされるデータに対してミリ秒未満の読み取りレイテンシーを提供し、データベースの負荷を軽減し、トラフィックの急増時の応答時間を短縮します。
クラスターの設定
データボリューム、スループット要件、運用設定に基づいてクラスタータイプを選択します。
| クラスタータイプ | 次の用途に適しています | スケーリング | 考慮事項 |
|---|---|---|---|
サーバーレス |
可変トラフィックパターン、新しいアプリケーション、キャッシュオペレーションの専門知識のないチーム |
自動 — 需要に基づいてコンピューティングとメモリをスケーリングします |
キャパシティプランニングは必要ありません。変動コストモデル — 消費した分に対して料金が発生します。 |
ノードベース (クラスターモードが有効) |
予測可能な高スループットワークロード、シャーディングとノードタイプをきめ細かく制御する必要あり |
シャードとレプリカの手動または自動スケーリング |
キャパシティプランニングが必要です。固定コストモデル — 使用率に関係なく、プロビジョニングされた容量に対して料金が発生します。クラスターあたり最大 500 ノードをサポートします。 |
ほとんどの e コマースアプリケーションでは、サーバーレスは本番環境への最も簡単なパスを提供します。トラフィックベースラインが予測可能で、クラスタートポロジ、ノードタイプ、スケーリング動作をより詳細に制御する必要がある場合は、ノードベースのクラスターに移行します。
| 設定 | 値 | 根拠 |
|---|---|---|
エンジン |
最新の安定バージョン |
ElastiCache で利用可能な最新の安定した Valkey リリースを使用します。Redis OSS コマンドとの完全な互換性。以前のバージョンよりもパフォーマンスが向上します。 |
マルチ AZ |
有効 |
プライマリノードに障害が発生した場合、別のアベイラビリティーゾーンのレプリカへの自動フェイルオーバー。本番稼働用の e コマースワークロードに必要です。 |
転送時の暗号化 |
有効 (TLS) |
アプリケーションとキャッシュクラスター間のデータを暗号化します。ユーザーセッションまたは PII を処理するワークロードに必要です。 |
保管時の暗号化 |
有効 |
ディスク上のデータを暗号化します (バックアップ、スワップ)。コンプライアンスワークロードに必要です。 |
サブネットグループ |
プライベート分離サブネット (2 つ以上の AZs) |
インターネットアクセスなし。アプリケーションのセキュリティグループからのみアクセスできます。 |
製品データの主要な設計
データ型間での衝突を避けるために、キャッシュキーを予測可能、デバッグ可能、スコープ設定するように設計します。
| データ型 | キーパターン | 値のタイプ | 例 |
|---|---|---|---|
製品の詳細 |
|
ハッシュ |
|
インベントリ数 |
|
文字列 (整数) |
|
ユーザーセッション |
|
ハッシュ |
|
検索結果 |
|
文字列 (JSON) |
|
カテゴリのリスト |
|
リスト |
|
主要な設計のベストプラクティス:
コロンを区切り文字として使用して読みやすくし、ツールをサポートします。
キーを短くする — ロングキーはメモリとネットワーク帯域幅を消費します。
製品、セッション、および数値 IDs。
マルチフィールドオブジェクト (製品、セッション) にハッシュを使用して、値全体を取得せずに部分的な読み取りと更新を許可します。
データ型別の TTL 戦略
カスタマーエクスペリエンスに影響を与えずにデータが変更される頻度と古くなる可能性に基づいて TTL (time-to-live) 値を設定します。
| データ型 | TTL | 無効化トリガー | 根拠 |
|---|---|---|---|
製品の詳細 |
5 分 |
販売者が製品を編集する |
製品の説明とイメージは頻繁に変更されません。すべての変更に対して明示的に無効化することなく、編集を合理的に迅速に取得するのに十分な長さ。 |
インベントリ数 |
30 秒 |
購入または補充する |
インベントリが古くなると、オーバーセリングが発生する可能性があります。非常に短い TTL により、カウントは頻繁に更新されます。即時精度のために、購入時の明示的な無効化。 |
検索結果 |
60 秒 |
なし (TTL ベースのみ) |
検索インデックスは定期的に更新されます。キャッシュは検索エンジンの負荷を軽減します。新しい製品は、明示的な無効化なしで 60 秒以内に表示されます。 |
ユーザーセッション |
24 時間 |
ログアウトまたはセッションの有効期限 |
セッションはブラウジング中に保持されます。各アクセスで TTL を更新して、アクティブなセッションを存続させます。ログアウト時に を明示的に削除します。 |
カテゴリのリスト |
2 分 |
カテゴリに追加/削除された製品 |
カテゴリページはトラフィックが多いです。簡易キャッシュは、ブラウジング中のデータベースクエリを大幅に削減します。 |
キャッシュアサイドパターン
キャッシュアサイドパターン (レイジーロードとも呼ばれます) は、e コマースアプリケーションの最も一般的なキャッシュ戦略です。アプリケーションは最初にキャッシュをチェックし、キャッシュミスに対してのみデータベースをクエリします。
読み取りパス (擬似コード)
FUNCTION getProduct(productId): cacheKey = "product:" + productId // Step 1: Check the cache cachedValue = cache.GET(cacheKey) IF cachedValue exists: RETURN deserialize(cachedValue) // Cache hit — sub-millisecond // Step 2: Cache miss — query database product = database.query("SELECT * FROM products WHERE id = ?", productId) IF product not found: RETURN null // Step 3: Write to cache with TTL cache.SET(cacheKey, serialize(product), EXPIRE = 300) // 5 minutes RETURN product
書き込みパス (擬似コード)
FUNCTION updateProduct(productId, updatedFields): // Step 1: Update the database (source of truth) database.update("UPDATE products SET ... WHERE id = ?", updatedFields, productId) // Step 2: Invalidate the cache (don't update it) cache.DELETE("product:" + productId) // Next read will trigger a cache miss and repopulate from database
重要
書き込み時にキャッシュを更新するのではなく、常に無効化 (削除) します。これにより、古い読み取りが新しい値を上書きする競合条件の時間枠が短縮されます。次の読み取りでは、信頼できるソースであるデータベースからキャッシュを再入力します。狭い競合条件がまだ存在することに注意してください。同時読み取りが書き込みが発生する前にデータベースからデータを取得する場合、キャッシュキーがすでに削除された後にキャッシュに古いデータを再入力できます。ほとんどの e コマースワークロードでは、短い TTL によりこれが許容されます。厳密な整合性が必要な場合は、分散ロックまたはバージョニングされた書き込みを使用します。
キャッシュ障害の処理
FUNCTION getProductWithFallback(productId): TRY: RETURN getProduct(productId) // Normal cache-aside path CATCH cacheConnectionError: // Cache is unavailable — fall back to database directly RETURN database.query("SELECT * FROM products WHERE id = ?", productId) // Log the error, trigger an alarm, but don't fail the request
キャッシュ障害によってパフォーマンスが低下し (レスポンスが遅くなります)、機能が損なわれないようにアプリケーションを設計します。データベースはフォールバックとして機能します。
キャッシュ無効化戦略
無効化により、ユーザーは更新後に現在のデータを確認できます。変更を表示する速度に基づいて戦略を選択します。
| アプローチ | 仕組み | どのようなときに使うか |
|---|---|---|
書き込み時に削除する |
アプリケーションは、データベースを更新した直後にキャッシュキーを削除します。 |
ほとんどの書き込み (製品編集、インベントリの変更)。シンプルで信頼性が高く、古いデータを回避します。 |
TTL の有効期限のみ |
無効にしない — TTL を自然に期限切れにします。 |
短い古さが許容されるデータ (検索結果、カテゴリリスト、分析)。 |
イベント駆動型無効化 |
バックグラウンドプロセスはデータベース変更イベントをリッスンし、影響を受けるキーを無効にします。 |
書き込みパスとキャッシュが異なるサービスにあるシステム、または単一のデータベースの変更が多くのキャッシュキーに影響するシステム。 |
Amazon CloudFront を CDN レイヤーとしても使用するマーケットプレイスアプリケーションの場合、両方の階層にわたって無効化を調整します。ElastiCache キーを削除し、CloudFront キャッシュ無効化 (またはキャッシュタグ無効化) を送信して、アプリケーションレイヤーとエッジレイヤーの両方で更新されたコンテンツを表示するようにします。
接続管理
-
接続プーリングを使用する — キャッシュオペレーションごとに新しい TLS 接続を作成すると、レイテンシーが増加します。永続的な接続のプールを維持し、リクエスト間で再利用します。
-
接続タイムアウトの設定 — 短い接続タイムアウト (1~2 秒) と短いコマンドタイムアウト (100~500 ミリ秒) を使用します。キャッシュが迅速に応答しない場合は、リクエストをブロックするのではなく、データベースにフォールバックします。
-
フェイルオーバーを適切に処理する — マルチ AZ フェイルオーバーが発生すると、古いプライマリブレークへの接続が切断されます。接続プールは接続の切断を検出し、自動的に再接続する必要があります。ほとんどのクライアントライブラリはこれを処理しますが、テスト対象の動作を検証します。
-
クラスターの設定エンドポイントを使用する — クラスターモードが有効になっている場合は、個々のノードエンドポイントではなく、設定エンドポイントに接続します。設定エンドポイントは、リクエストを正しいシャードに自動的にルーティングします。
モニタリングする主要なメトリクス
| メトリクス | Threshold | Period | アクション |
|---|---|---|---|
CacheHitRate |
< 80% |
5 分 |
調査 — ヒット率が低い場合、TTLsが短すぎる、キーの設計が不十分な、またはワーキングセットがメモリを超えている可能性があります。 |
EngineCPUUtilization |
> 70% |
5 分 |
スケールアップ (より大きなノード) またはスケールアウト (より多くのシャード)。CPU が高い場合は、キャッシュが効率的に処理できるよりも多くのコマンドを処理していることを示します。 |
DatabaseMemoryUsagePercentage |
> 80% |
5 分 |
エビクションのリスク。メモリを増やす (スケールアップ) か、保存されたデータを減らす (TTLs短い、キャッシュされたデータ型が少ない)。 |
Evictions |
> 0 持続 |
1 分 |
キャッシュがいっぱいになり、スペースを確保するためにデータを削除します。キャッシュミスを増やします。重要度の低いデータのメモリをスケールアップするかTTLsます。 |
CurrConnections |
> クライアントプールサイズの 80% |
5 分 |
接続プールが枯渇に近づいています。プールサイズの増加、接続の保持時間の短縮、アプリケーションコードの接続リークの調査を行います。サーバーの最大数 (65,000) ではなく、アプリケーションが設定したプールサイズに基づいてしきい値を設定します。 |
よくある質問
Serverless とノードベースのどちらを使用すればよいですか?
トラフィックが予測不可能な場合 (新しいマーケットプレイス、季節的な急増)、キャパシティプランニングを回避する場合、またはチームがキャッシュオペレーションの専門知識を持っていない場合は、Serverless を使用します。トラフィックパターンが安定している場合、シャーディングをきめ細かく制御する必要がある場合、または持続的なスループットにより、ノードベースのコスト効率が向上します。
Valkey または Redis OSS を使用する必要がありますか?
新しいデプロイには Valkey を使用します。Valkey は新しい ElastiCache クラスターのデフォルトエンジンであり、Redis OSS コマンドおよびデータ構造と完全に互換性があり、継続的な開発を受け取ります。既存の Redis OSS クラスターは引き続き機能します。インプレースエンジンアップグレードを使用して、都合の良いときに Valkey に移行します。
キャッシュが使用できない場合はどうなりますか?
アプリケーションは、キャッシュを依存関係ではなく最適化として扱う必要があります。キャッシュが使用できない場合は、データベースの直接クエリにフォールバックします。応答時間は長くなりますが、アプリケーションは機能し続けます。マルチ AZ を有効にすると、完全なキャッシュが利用できなくなることはまれです。通常、レプリカへのフェイルオーバーは 30 秒以内に完了します。
必要なメモリを見積もるにはどうすればよいですか?
計算: (キャッシュする一意の項目の数) × (項目あたりの平均サイズ) × (Valkey データ構造のオーバーヘッド係数 1.2)。オーバーヘッドはオブジェクトのサイズとデータ型によって異なります。オブジェクトが小さいほどオーバーヘッドが比例して高くなります。たとえば、2 KB の 100,000 個の製品で、それぞれ 1.2 倍のオーバーヘッド = 約 240 MB です。セッションデータ、検索結果、インベントリ数を追加します。ヘッドルームから開始し (使用可能なメモリの 60% をターゲットとして使用)、 DatabaseMemoryUsagePercentage メトリクスをモニタリングして調整します。