2017-08-21 3 views
0

DataStax C++ドライバを使用したCassandra Developmentについてはかなり新しいです。私は現在、Cassandra 3.9とDataStax C++ドライバ2.6を使用しています。私のC++アプリケーションでは、ドライバがCassandraへの接続を失った状況をキャッチして、アプリケーションがCassandraへの接続を再試行するようにしようとしています。私は次のようにしています:カサンドラ紛失接続の処理方法は?

  1. cass_future_error_code(connection)!= CASS_OKを確認してクエリを実行する前に、接続を切断してください。結果が真であれば、接続が失われていることがわかります。
  2. 私はセッションを閉じ、セッションを解放し、リソースを解放するためにクラスタを解放します。
  3. リソースを再作成し、Cassandraに再接続しようとしました。

このアプローチは、接続が再確立されるまで別のスレッドで繰り返されます。私はCassandra Serverをシャットダウンすることでこれをテストしました。 Cassandra Serverを再起動して接続が確立されるまで、アプリケーションを再試行して接続を確立することを期待していました。

1503345418.300 [WARN] (src/control_connection.cpp:267:virtual void cass::ControlConnection::on_close(cass::Connection*)): Lost control connection to host xx.xx.xx.xx with the following error: Read error 'connection reset by peer' 
1503345418.300 [ERROR] (src/pool.cpp:384:virtual void cass::Pool::on_close(cass::Connection*)): Closing established connection pool to host xx.xx.xx.xx because of the following error: Read error 'connection reset by peer' 
Error: Request timed out 

がカサンドラに失われた接続を処理し、接続の再試行を実施するためのより良い方法があります:しかし、何が起こったことは、ドライバが次のエラーを投げ、私のアプリケーションが終了したことでしたか?例への例や指針は非常に高く評価されます。

答えて

0

DataStax C/C++ドライバは自動的に再接続を処理します。 cass_cluster_set_reconnect_wait_time(Cluster*, time_in_ms)を使用して再接続の試行を抑制することができます(デフォルトは2秒です)。 https://github.com/datastax/cpp-driver/blob/2.6.0/include/cassandra.h#L1080-L1092。ドライバがノードが停止したことを検出すると、自動的に再接続を試みます。

+0

接続が失われ、クライアントアプリケーションがクエリを送信しようとするとどうなりますか?クエリは削除されますか?あなたはこの状況に対処する例を知っていますか? –

+0

それが単一ノードクラスタであり、現在そのノードが利用できない場合は、 'CASS_ERROR_LIB_NO_HOSTS_AVAILABLE'を取得する必要があります。この状況では、クエリは削除される(またはサーバー上で実行されることはありません)。クエリーを再実行するには、クライアントアプリケーションが必要です。 – Fero

+0

ありがとうございます。私はあなたの助けに感謝します。 :-) –

関連する問題