多数の接続 (Valkey と Redis OSS) - Amazon ElastiCache

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

多数の接続 (Valkey と Redis OSS)

サーバーレスキャッシュと個々の ElastiCache (Redis OSS) ノードは、最大 65,000 の同時クライアント接続をサポートします。ただし、パフォーマンスを最適化するために、クライアントアプリケーションが常にはそのレベルの接続で動作しないことをお勧めします。Valkey と Redis OSSはそれぞれ、受信クライアントリクエストが順番に処理されるイベントループに基づいて、シングルスレッドプロセスがあります。つまり、接続しているクライアントの数が増えると、特定のクライアントの応答時間が長くなります。

Valkey または Redis OSSサーバーで接続のボトルネックが発生しないように、次のアクションを実行できます。

  • リードレプリカからの読み取り操作を実行する。これは、クラスターモードで ElastiCache リーダーエンドポイントを無効にするか、サーバーレスキャッシュを含むクラスターモードでの読み取りにレプリカを使用することで実行できます。

  • 書き込みトラフィックを複数のプライマリノードに分散する。これには 2 つの方法があります。マルチシャード Valkey または Redis OSSクラスターは、クラスターモード対応クライアントで使用できます。また、クライアント側のシャーディングで無効になっているクラスターモードで、複数のプライマリノードに書き込むこともできます。これはサーバーレスキャッシュで自動的に行われます。

  • クライアントライブラリで利用可能な場合は、接続プールを使用する。

一般的に、TCP接続の作成は、一般的な Valkey または Redis OSS コマンドと比較して計算コストの高い操作です。例えば、SET/GET リクエストの処理は、既存の接続を再利用する場合に、桁違いに高速になります。有限サイズのクライアント接続プールを使用すると、接続管理のオーバーヘッドが軽減されます。また、クライアントアプリケーションからの同時着信接続数も制限されます。

次のコード例は、新しいユーザーリクエストごとに新しい接続が作成されているPHPRedisことを示しています。

$redis = new Redis(); if ($redis->connect($HOST, $PORT) != TRUE) { //ERROR: connection failed return; } $redis->set($key, $value); unset($redis); $redis = NULL;

このコードを Graviton2 (m6g.2xlargeEC2) ElastiCache (Redis ) ノードに接続された Amazon Elastic Compute Cloud (Amazon OSS) インスタンスのループでベンチマークしました。クライアントとサーバーは同じアベイラビリティーゾーンに配置されています。オペレーション全体の平均レイテンシーは 2.82 ミリ秒でした。

コードを更新して永続的な接続と接続プールを使用した場合、オペレーション全体の平均レイテンシーは 0.21 ミリ秒でした。

$redis = new Redis(); if ($redis->pconnect($HOST, $PORT) != TRUE) { // ERROR: connection failed return; } $redis->set($key, $value); unset($redis); $redis = NULL;

必要な redis.ini の設定:

  • redis.pconnect.pooling_enabled=1

  • redis.pconnect.connection_limit=10

以下のコードは Redis-py 接続プールの例です。

conn = Redis(connection_pool=redis.BlockingConnectionPool(host=HOST, max_connections=10)) conn.set(key, value)

以下のコードは Lettuce 接続プールの例です。

RedisClient client = RedisClient.create(RedisURI.create(HOST, PORT)); GenericObjectPool<StatefulRedisConnection> pool = ConnectionPoolSupport.createGenericObjectPool(() -> client.connect(), new GenericObjectPoolConfig()); pool.setMaxTotal(10); // Configure max connections to 10 try (StatefulRedisConnection connection = pool.borrowObject()) { RedisCommands syncCommands = connection.sync(); syncCommands.set(key, value); }