Search code examples
node.jscassandradatastax-enterprisecassandra-driver

How to handle timeouts in Cassandra + AWS Lambda


I've a Lambda function with VPC that connecting to Cassandra.

I think that because of cold-start or other issue it can't connect to the Cassandra at all, the Lambda have timeout of 10s, I want to add timeout for the Cassandra as well, if the first connection not being made I will kill the script and return that there was an issue.

I'm using cassandra-driver for node js: https://github.com/datastax/nodejs-driver/

Conneciton:

const cassandra = require('cassandra-driver');
const client = new cassandra.Client({ contactPoints: ['127.0.0.1'], keyspace: 'keyspace' });

I can't use the timeout of the nodejs and then check the connection because the Lambda won't finish the code until the timeout will finished, even if everything was okay.


Solution

  • It looks like you have timeout available to you as an optional parameter for the Client object here

    It should be a matter of assigning this optional parameter to a value of your preference. You should also look for handling the connection problem in the callback function.

    const cassandra = require('cassandra-driver');
    /* Documentation: github.com/datastax/nodejs-driver/blob/master/lib/client.js - line 120*/
    const client = new cassandra.Client(
    { 
       contactPoints: ['127.0.0.1'],
       keyspace: 'keyspace',
       socketOptions:
       {
          connectTimeout: 2000
       }
    });
    

    After creating the client you should be able to specify (in case it doesn't work) a callback on the connect method.

    /* Documentation: github.com/datastax/nodejs-driver/blob/master/lib/client.js - line 320 */
    client.connect(function (err) {
       if (err) return console.error(err); /* your attempt to connect is terminated here. */
       console.log('Connected to cluster with %d host(s): %j', 
       client.hosts.length, client.hosts.keys());
    });
    

    Once you've verified your (err) is present - your connection attempt is basically terminated. It's up to you to re-try / kill / do something else with your AWS lambda.