web-dev-qa-db-ja.com

高性能と信頼性のためのジェダイ接続設定

Redisサーバーへの接続にJedisクライアントを使用しています。以下は、(Apache共通プールを使用して)Jedisに接続するために使用している設定です。

JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(true);
poolConfig.setMaxIdle(400);

// Tests whether connections are dead during idle periods
poolConfig.setTestWhileIdle(true);
poolConfig.setMaxTotal(400);

// configuring it for some good max value so that timeout don't occur
poolConfig.setMaxWaitMillis(120000);

これまでのところ、これらの設定では信頼性の点で問題は発生していませんが(いつでも、いつでもJedis接続を取得できます)、Jedisのパフォーマンスに一定の遅れが見られます。

誰かが私に高性能を達成するためのもう少し最適化を提案できますか?

10
pjain

3つのテストが構成されています。

  • TestOnBorrow-リソースを要求すると、PING要求を送信します。
  • TestOnReturn-リソースをプールに返すときにPINGを送信します。
  • TestWhileIdle-プール内のアイドル状態のリソースから定期的にPINGSを送信します。

接続がまだ有効であることがわかっているのは良いことですが、これらのonBorrow PINGリクエストはリクエストの前にRTTを浪費しており、他の2つのテストは貴重なRedisリソースを浪費しています。理論的には、PINGテストの後でさえ接続が悪くなる可能性があるため、コードで接続例外をキャッチし、PINGを送信した場合でもそれに対処する必要があります。ネットワークが安定していて、ドロップが多すぎない場合は、これらのテストを削除し、例外キャッチでのみこのシナリオを処理する必要があります。

また、MaxIdle == MaxTotalを設定することにより、プールからのリソースの削除はありません(良い/悪い?、使用状況によって異なります)。また、プールが使い果たされると、リソースを取得しようとすると、空きリソースを2分間待機した後、タイムアウトになります。

15
Ofir Luzon