翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
リードレプリカを使用するためのベストプラクティス
セッションストア、リーダーボード、レコメンデーションエンジンなどの多くのアプリケーションは、高可用性を必要とし、書き込みオペレーションよりも大幅に多くの読み取りオペレーションを処理します。これらのアプリケーションは、多くの場合、わずかに古いデータ (結果整合性) を許容します。つまり、異なるユーザーが同じデータのわずかに異なるバージョンを一時的に表示しても問題ありません。例:
キャッシュされたクエリ結果は、特に信頼できるソースが外部であるキャッシュ以外のパターンでは、わずかに古いデータを許容することがよくあります。
ゲームリーダーボードでは、更新されたスコアに数秒の遅延があっても、ユーザーエクスペリエンスに大きな影響を与えないことがよくあります。
セッションストアの場合、レプリカ間でのセッションデータの伝播にわずかな遅延が生じると、アプリケーションの機能にはほとんど影響しません。
レコメンデーションエンジンは通常、履歴データ分析を使用するため、リアルタイムの一貫性はそれほど重要ではありません。
結果整合性とは、レプリケーションプロセスが完了すると、通常はミリ秒以内に、すべてのレプリカノードが同じデータを最終的に返すことを意味します。このようなユースケースでは、リードレプリカの実装は、ElastiCache インスタンスから読み取る際のレイテンシーを低減するための効果的な戦略です。
Amazon ElastiCache でリードレプリカを使用すると、次のような大きなパフォーマンス上の利点が得られます。
強化された読み取りスケーラビリティ
複数のレプリカノードに読み取りオペレーションを分散します
プライマリノードからの読み取りトラフィックをオフロードします
地理的に近いレプリカからのリクエストを処理することで読み取りレイテンシーを削減
プライマリノードのパフォーマンスの最適化
プライマリノードリソースを書き込みオペレーション専用にします
プライマリノードの接続オーバーヘッドを削減
書き込みパフォーマンスを向上させ、ピークトラフィック期間中の応答時間を改善
ElastiCache サーバーレスでのレプリカからの読み取りの使用
ElastiCache サーバーレスは、異なる整合性要件に対して 2 つの異なるエンドポイントを提供します。2 つのエンドポイントは同じ DNS 名を使用しますが、ポートは異なります。レread-from-replicaポートを使用するには、VPC のセキュリティグループとネットワークアクセスコントロールリストを設定して、クライアントアプリケーションから両方のポートへのアクセスを許可する必要があります。
プライマリエンドポイント (ポート 6379)
即時整合性を必要とするオペレーションに を使用する
up-to-dateデータを読み取る保証
重要なトランザクションと書き込みオペレーションに最適
書き込みオペレーションに必要
例:
test-12345.serverless.use1.cache.amazonaws.com:6379
レイテンシー最適化エンドポイント (ポート 6380)
結果整合性を許容できる読み取りオペレーション用に最適化
可能であれば、ElastiCache サーバーレスは読み取りリクエストをクライアントのローカルアベイラビリティーゾーンのレプリカノードに自動的にルーティングします。この最適化は、別のアベイラビリティーゾーンのノードからデータを取得するときに発生する追加のネットワークレイテンシーを回避することで、レイテンシーを短縮します。
ローカルノードが使用できない場合、ElastiCache サーバーレスは他のゾーンで使用可能なノードを自動的に選択します
例:
test-12345.serverless.use1.cache.amazonaws.com:6380
Glide や Lettuce などのクライアントは、レプリカ設定からの読み取りを指定すると、レイテンシー最適化エンドポイントに読み取りを自動的に検出してルーティングします。クライアントがルーティング設定 (valkey-java 以前の jedis バージョンなど) をサポートしていない場合は、レプリカから読み取る適切なポートとクライアント設定を定義する必要があります。
ElastiCache Serverless でのリードレプリカへの接続 - Valkey と Glide
次のコードスニペットは、Valkey glide ライブラリで ElastiCache Serverless のレプリカからの読み取りを設定する方法を示しています。レプリカからの読み取りにポートを指定する必要はありませんが、ルーティング設定 を設定する必要がありますReadFrom.PREFER_REPLICA
。
package glide.examples; import glide.api.GlideClusterClient; import glide.api.logging.Logger; import glide.api.models.configuration.GlideClusterClientConfiguration; import glide.api.models.configuration.NodeAddress; import glide.api.models.exceptions.ClosingException; import glide.api.models.exceptions.ConnectionException; import glide.api.models.exceptions.TimeoutException; import glide.api.models.configuration.ReadFrom; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; public class ClusterExample { public static void main(String[] args) { // Set logger configuration Logger.setLoggerConfig(Logger.Level.INFO); GlideClusterClient client = null; try { System.out.println("Connecting to Valkey Glide..."); // Configure the Glide Client GlideClusterClientConfiguration config = GlideClusterClientConfiguration.builder() .address(NodeAddress.builder() .host("your-endpoint") .port(6379) .build()) .useTLS(true) .readFrom(ReadFrom.PREFER_REPLICA) .build(); // Create the GlideClusterClient client = GlideClusterClient.createClient(config).get(); System.out.println("Connected successfully."); // Perform SET operation CompletableFuture<String> setResponse = client.set("key", "value"); System.out.println("Set key 'key' to 'value': " + setResponse.get()); // Perform GET operation CompletableFuture<String> getResponse = client.get("key"); System.out.println("Get response for 'key': " + getResponse.get()); // Perform PING operation CompletableFuture<String> pingResponse = client.ping(); System.out.println("PING response: " + pingResponse.get()); } catch (ClosingException | ConnectionException | TimeoutException | ExecutionException e) { System.err.println("An exception occurred: "); e.printStackTrace(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { // Close the client connection if (client != null) { try { client.close(); System.out.println("Client connection closed."); } catch (ClosingException | ExecutionException e) { System.err.println("Error closing client: " + e.getMessage()); } } } } }