質問

Jredisの同期実装を使用していますが、Redisサーバーと通信するための非同期方法に切り替えることを計画しています。

しかし、その前に、私はコミュニティにJredisfutureのAlphazeroの実装がかどうかを尋ねたいと思います Jredis 生産の使用に十分な安定していますか?

それを使用している人や経験がある人はいますか?

ありがとう!

役に立ちましたか?

解決

Jredisがトランザクションセマンティクス(Redis 1.3.n、Jredis Master Branch)のサポートを受けた場合、確かに、それは十分に「安定」である必要があります。

非輸送コマンドのRedisプロトコル自体は、破壊的なコマンドが送信されたときに回復不可能な障害のウィンドウを可能にし、読み取りフェーズで接続障害を読み取ります。クライアントは、Redisが実際に最後の要求を処理したかどうかを知る方法がありませんが、ネットワークの障害により応答が削除されました(たとえば)。基本的なリクエスト/返信クライアントでさえ、これに影響を受けやすいです(そして、これはJava自体に限定されないと思います。)

Redisのプロトコルでは、DMLおよびDDLタイプコマンド(例:コマンドシーケント番号なし)を使用したメタデータ(まったく)を必要としないため、この障害のウィンドウが開きます。

パイプラインでは、書かれているコマンドと読み取られている応答との間に連続的な関連性がなくなりました。 (パイプは、Redisが同時に読み取られている応答を発行する原因となったnコマンドのコマンドを送信しています。

とはいえ、パイプ内のすべての将来のオブジェクトは障害としてフラグが付けられ、あなたは 知る 正確にどの 応答 障害が発生しました。

それは「不安定な」と見なされますか?私の意見では、いいえ。それはパイプラインの問題です。

繰り返しますが、トランザクションセマンティクスを備えたRedis 1.3.nは、この問題に完全に対処しています。

その問題以外では、非同期(パイプライン)により、コネクタに入力を過度に過負荷にしないようにするために、あなたの側に大きな責任があります。 Jredis Pipelinesは大部分がこれからあなたを保護します(発信者のスレッドは、ネットワークを書き込むために使用されるため、保留中の応答キューの入力負荷を自然に減衰させるため)。

しかし、あなたはまだテストを実行する必要があります - あなたは「生産」と言ったでしょう? )) - そして、ボックスをサイズして、フロントエンドのロードスレッドの数にキャップを置きます。

また、マルチコアマシンで複数のJredisパイプラインを実行しないことをお勧めします。既存の実装(書き込みバッファーをチャンクしない)には、同じサーバーに複数のパイプラインを実行することで得られる効率(完全な帯域幅の利用とスループットの最大化のコンテキストで)の余地があります。 1つのパイプラインは書くためのバッファーを作成するのに忙しい間、もう1つは書き込みなどです。しかし、これらの2つのパイプラインは、それら(避けられない - キューであり、何らかの形の同期が発生しなければならないことを覚えています)と定期的なキャッシュの無効化のために互いに干渉します(最悪の場合は各dequeue/enqueueで - しかし、ダグLeaでは私たちは信頼しています。)したがって、パイプラインが平均レイテンシーヒットD1(単独で)がある場合、パイプBもそうです。残念ながら、同じコアでそれらの2つを実行すると結果として生じます新しいシステムでは、元のシステムの半分であるワイドキャッシュ無効化期間があるため、キャッシュの無効化が平均して2倍になります(平均して)。だからそれは自己敗北です。ただし、負荷条件をテストし、予測された生産展開プラットフォームでテストします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top