2013-07-16 16 views
5

Jak można powiedzieć kierowcy Datastax Java Cassandra do limitu czasu, gdy próbuje połączyć się z klastra?Powiedz kierowcy Datastax Java Cassandra aby limit czasu połączenia klastra

Jestem szczególnie zainteresowany przypadkiem, gdy hosty są osiągalne, ale porty Cassandra są zablokowane lub demony Cassandra nie działają. Piszę klienta wiersza poleceń, który powinien wyjść i zgłosić odpowiedni komunikat o błędzie, jeśli nie może nawiązać połączenia w rozsądnym czasie. Obecnie wydaje się, że kierowca będzie czekał na zawsze, aby punkt kontaktowy mógł odpowiedzieć, jeśli punkt kontaktowy jest osiągalny.

To znaczy, chcę, aby Cluster.build() rzucił NoHostAvailableException, jeśli kierowca nie może komunikować się z demonem Cassandra któregokolwiek z punktów kontaktowych w danym maksymalnym czasie.

  • Tworzenie własne RetryPolicy nie zadziała: to dla zapytań Ponowna próba i chcę timeout zastosować przed jesteśmy gotowi do uruchomienia zapytania.
  • Tworzenie mój własny ReconnectinoPolicy początkowo wyglądał obiecująco, ale kontrakt dla interfejsu daje żadnych środków do wskazywania „rozważyć ten węzeł nie żyje wiecznie więcej”

Odpowiedz

7

Oznacza to, że chcę Cluster.build() rzucić wyjątek NoHostAvailableException, jeśli sterownik nie może komunikować się z demonem Cassandra któregokolwiek z punktów kontaktowych w określonym maksymalnym czasie.

Tak właśnie powinno być. Sterownik spróbuje połączyć się z każdym z punktów kontaktowych i wyrzucić wyjątek, jeśli nie uda się połączyć z żadnym z nich. Możesz kontrolować maksymalny czas, w którym sterownik będzie próbował połączyć się (do każdego węzła) przez SocketOptions.setConnectTimeoutMillis() (domyślnie jest to 5 sekund).

Moje doświadczenie jest takie, że Cluster.build() zwraca wyjątek, jeśli żaden węzeł nie może być podłączony, ale jeśli twoje doświadczenie się różni, możesz zgłosić to jako błąd (ale trochę więcej szczegółów na temat tego, jak się rozmnażasz to pomogłoby).

to pod uwagę:

  • Przeterminowanie powyżej jest na komputerze. Jeśli więc przekażesz listę 100 punktów kontaktowych, teoretycznie możesz poczekać 500 sekund (domyślnie) przed uzyskaniem wyjątku NoHostAvailableException. Ale nie ma prawdziwy sens pod warunkiem, że wiele punktów kontaktowych, aw praktyce, jeśli Cassandra nie jest uruchomiony na węźle próbował, próba połączenia będzie zwykle nie od razu (nie będzie czekać timeout).
  • Obecnie nie ma limitu czasu rzeczywistego zapytania po stronie kierowcy. Co oznacza, że ​​jeśli sterownik łączy się z węzłem (co oznacza, że ​​jakiś proces nasłuchuje na tym porcie i akceptuje połączenie), ale nie otrzymuje odpowiedzi na swoje początkowe komunikaty, to faktycznie może on na zawsze pozostać. Prawdopodobnie powinno to zostać naprawione i zachęcam do otwarcia biletu na to na https://datastax-oss.atlassian.net/browse/JAVA. Jednakże, to nie wydaje się być w przypadku opisujesz, ponieważ jeśli „Cassandra porty są zablokowane lub demony Cassandra nie działa”, to kierowca nie powinien być w stanie połączyć się w pierwszej kolejności.
+0

Możliwe, ja faktycznie widząc drugi przypadek. Muszę przegapić tę opcję gniazda. Jak sugerujesz, to powinno wystarczyć w większości przypadków. – Raedwald

+0

@Raedwald, czy zgłosiłeś błąd dla tego problemu, czy też było łatwiejsze rozwiązanie? –

Powiązane problemy