Как справиться с потерянными связями Кассандры?

Я довольно новичок в разработке Cassandra, использующей драйвер DataStax C ++. В настоящее время я использую Cassandra 3.9 и драйвер DataStax C ++ 2.6. В моем приложении C ++ я пытаюсь отловить ситуации, когда драйвер потерял соединение с Cassandra, а затем повторять попытку приложения установить соединение с Cassandra. Я делаю это следующим образом:

  1. Перехватите потерянное соединение перед выполнением запроса, проверив, что cass_future_error_code (connection)! = CASS_OK. Если результат верен, то я знаю, что связь потеряна.
  2. Я закрываю сеанс, освобождаю сеанс и освобождаю кластер для освобождения ресурсов.
  3. Я воссоздаю ресурсы и пытаюсь воссоединиться с Кассандрой.

Этот подход будет повторяться в отдельном потоке, пока соединение не будет восстановлено. Я проверил это, выключив сервер Cassandra. Я ожидал, что приложение продолжит попытки установить соединение, пока сервер Cassandra не будет перезагружен и соединение не будет установлено. Однако случилось так, что драйвер выдал следующую ошибку, и мое приложение прекратило работу:

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

Есть ли лучший способ обработать потерянные соединения с Cassandra и осуществить повторную попытку соединения? Любые примеры или указатели на пример будут с благодарностью.

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

Другие решения

Других решений пока нет …