java cassandra

java - Vuelva a intentar la conexión al nodo de Cassandra en el inicio



(5)

Debería poder escribir alguna lógica de prueba / captura en la NoHostAvailableException para volver a intentar la conexión después de una espera de 5-10 segundos. Recomendaría hacerlo solo unas cuantas veces antes de lanzar la excepción después de un cierto período de tiempo en el que sabe que debería haber comenzado en ese momento.

Ejemplo de pseudocódigo

Connection makeCassandraConnection(int retryCount) { Exception lastException = new IllegalStateException(); while (retryCount > 0) { try { return doConnectionStuff(); } catch (NoHostAvailableException e) { lastException = e; retryCount--; Thread.sleep(TimeUnit.SECONDS.toMillis(5)); } } throw lastException; }

Quiero usar Docker para iniciar mi aplicación y la base de datos Cassandra, y me gustaría usar Docker Compose para eso. Desafortunadamente, Cassandra comienza mucho más lento que mi aplicación, y como mi aplicación inicializa con entusiasmo el objeto Cluster , obtengo la siguiente excepción:

com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: cassandra/172.18.0.2:9042 (com.datastax.driver.core.exceptions.TransportException: [cassandra/172.18.0.2:9042] Cannot connect)) at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:233) at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79) at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1454) at com.datastax.driver.core.Cluster.init(Cluster.java:163) at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:334) at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:309) at com.datastax.driver.core.Cluster.connect(Cluster.java:251)

De acuerdo con el seguimiento de la pila y un poco de depuración, parece que el controlador Cassandra Java no aplica las políticas de reintento al inicio inicial. Esto me parece un poco raro. ¿Hay alguna forma de configurar el controlador para que continúe con sus intentos de conectarse al servidor hasta que tenga éxito?


El controlador Datastax no se puede configurar de esta manera.

Si esto es solo un problema con Docker y no desea cambiar su código, podría considerar usar algo como wait-for-it que es un script simple que esperará a que un puerto TCP esté escuchando antes de iniciar su aplicación. 9042 es el puerto de transporte nativo de cassandra.

Otras opciones se discuten aquí en la documentación de la ventana acoplable , pero yo personalmente solo he usado la opción de esperar, pero me pareció útil cuando se trabaja con Cassandra dentro de la ventana acoplable.


Intente aumentar el tiempo de espera de la conexión; a veces sucede lo único en AWS y similares. Creo que está viendo una etapa tardía en el registro de errores, en algún momento debería decirle que no se pudo conectar debido a un tiempo de espera o una red inaccesible, y luego marca los nodos como no disponibles.

Usando fantasma, el código es como abajo:

val Connector = ContactPoints(Seq(seedHost)) .withClusterBuilder(_.withSocketOptions( new SocketOptions() .setReadTimeoutMillis(1500) .setConnectTimeoutMillis(20000) )).keySpace("bla")

Enlace de recursos:

com.datastax.driver.core.exceptions.NoHostAvailableException # 445


Si está orquestando muchas ventanas acoplables, debe elegir una ventana acoplable que dependa de la etiqueta.

version: ''2'' services: cassandra: image: cassandra:3.5 ports: - "9042:9042" - "9160:9160" environment: CASSANDRA_CLUSTER_NAME: demo app: image: your-app restart: unless-stopped depends_on: - cassandra


Si no desea cambiar su código de cliente y el contenedor de la ventana acoplable de la aplicación de su cliente se detiene debido al error, puede usar el siguiente atributo para la aplicación cliente en su archivo de composición de la ventana acoplable.

restart: unless-stopped

Eso reiniciará el contenedor de la aplicación cliente tantas veces como falle. Ejemplo de archivo docker-compose.yml:

version: ''2'' services: cassandra: image: cassandra:3.5 ports: - "9042:9042" - "9160:9160" environment: CASSANDRA_CLUSTER_NAME: demo app: image: your-app restart: unless-stopped