2013-07-16 7 views
5

Wie wird dem Datastax Java Cassandra-Treiber eine Zeitüberschreitung mitgeteilt, wenn er versucht, eine Verbindung zu Ihrem Cluster herzustellen?Tell Datastax Java Cassandra-Treiber für Timeout-Clusterverbindung

Ich bin besonders an dem Fall interessiert, wenn die Hosts erreichbar sind, aber die Cassandra-Ports blockiert sind oder die Cassandra-Dämonen nicht laufen. Ich schreibe einen Befehlszeilenclient, der eine geeignete Fehlermeldung beenden und melden sollte, wenn er sich nicht in angemessener Zeit verbinden kann. Zur Zeit scheint es, dass der Fahrer ewig auf einen Kontaktpunkt zur Antwort warten wird, wenn der Kontaktpunkt erreichbar ist.

Das heißt, ich möchte Cluster.build() eine NoHostAvailableException werfen, wenn der Treiber nicht mit dem Cassandra-Daemon von irgendeinem der Kontaktpunkte innerhalb einer gegebenen maximalen Zeit kommunizieren kann.

  • mein eigenes Erstellen RetryPolicy wird nicht funktionieren: dass der erneute Abfragen ist, und ich möchte das Timeout anwenden, bevor wir bereit sind, Abfragen auszuführen.
  • Erstellen von meinem eigenen ReconnectinoPolicy zunächst sahen vielversprechend aus, aber der Vertrag für die Schnittstelle gibt keine Mittel zur Anzeige „diesen Knoten betrachten, tot zu sein für immer mehr“

Antwort

7

Das heißt, ich will Cluster.build() um eine NoHostAvailableException zu werfen, wenn der Treiber nicht innerhalb einer gegebenen maximalen Zeit mit dem Cassandra-Daemon eines der Kontaktpunkte kommunizieren kann.

Dies soll der Fall sein. Der Treiber versucht, eine Verbindung zu jedem der Kontaktpunkte herzustellen und eine Ausnahme auszulösen, wenn keine Verbindung zu einem der Kontaktpunkte hergestellt werden kann. Sie können die maximale Zeit steuern, die der Treiber versucht, die Verbindung zu jedem Knoten über SocketOptions.setConnectTimeoutMillis() herzustellen (der Standardwert ist 5 Sekunden).

Meine Erfahrung ist, dass Cluster.build() eine Ausnahme zurückgibt, wenn kein Knoten verbunden werden kann, aber wenn Ihre Erfahrung unterscheidet, möchten Sie es möglicherweise als Fehler melden (aber ein bisschen genauer, wie Sie reproduzieren das würde helfen).

Davon abgesehen:

  • Die Timeout oben pro Host ist. Wenn Sie also eine Liste von 100 Kontaktpunkten übergeben, können Sie theoretisch 500 Sekunden (standardmäßig) warten, bevor Sie die NoHostAvailableException erhalten. Aber es gibt keinen wirklichen Sinn darin, so viele Kontaktpunkte bereitzustellen, und in der Praxis wird der Verbindungsversuch normalerweise sofort fehlschlagen, wenn Cassandra nicht auf dem ausprobierten Knoten läuft (Sie werden das Timeout nicht abwarten).
  • Derzeit gibt es auf der Treiberseite kein echtes Abfrage-Timeout. Was bedeutet, dass, wenn der Treiber eine Verbindung zu einem Knoten herstellt (was bedeutet, dass einige Prozess auf diesen Port hört und die Verbindung akzeptieren), aber keine Antwort auf seine ersten Nachrichten erhalten, dann kann es tatsächlich für immer halten. Das sollte wahrscheinlich behoben sein, und ich ermutige Sie, ein Ticket dafür auf https://datastax-oss.atlassian.net/browse/JAVA zu öffnen. Dies scheint jedoch nicht der Fall zu sein, den Sie beschreiben, da, wenn "Cassandra-Ports blockiert sind oder die Cassandra-Dämonen nicht laufen", der Treiber nicht in der Lage sein sollte, überhaupt eine Verbindung herzustellen.
+0

Es ist möglich, dass ich tatsächlich den zweiten Fall sehe. Ich muss diese Socket-Option verpasst haben. Wie Sie meinen, sollte das für die meisten Fälle gut genug sein. – Raedwald

+0

@Raedwald, hast du einen Fehler für dieses Problem eingereicht, oder gab es eine einfachere Lösung? –

Verwandte Themen