Cassandra is the current de facto standard in flat, scalable, cloud based database applications and as such usually only exists in AWS or linux clusters.
Fortunately, you can install Cassandra on windows in a single node configuration. For more info on the configurations available in a distributed install, see Planet Cassandra.
Previously I have worked on SOLR, which struck me as a similar construct to the node structure of Cassandra, specifically with the lack of master slave that you would normally have found in traditional clusters.
By avoiding a master slave format, Cassandra allows an elastic structure to cover the database records, akin to a RAID striping, and does a great job when you have geo-spaced clusters allowing for quick responses from the database at a global scale.
Cassandra has several connectors, covering all the major server side languages, including Javascript(nodejs), Java, Python, Ruby, C#.
Here I will show you how to connect a C# WCF service to Cassandra to retrieve records.
Firstly, install Cassandra, taking special care with prerequisites.
Go into the cassandra query language shell(CQL, and it probably has a python icon on it)..
Create a new keyspace, which allows you to add tables.
create keyspace casswcfexample with replication={'class':'SimpleStrategy', 'replication_factor':1};
Add a new table to your keyspace.
use casswcfexample;
create table exampletable(tid int primary key, title varchar, description varchar);
You can press enter for a new line in CQL, and it will continue, and won’t submit the statement until you add a semicolon
Add data to your keyspace’s exampletable
insert into exampletable(tid, title, description) values(1,'first title', 'description');
insert into exampletable(tid, title, description) values(2,'second title', 'another description');
Verify the data in your keyspace:table
select * from exampletable;
OK, now we have a running cassandra instance with data in it, let’s hook it up to a new, empty, WCF project.
As a rule, I always have my data layer as a separate project, to allow me to reuse it.
Create a new Solution, and add a WCF Application, leave it named as WCFService1.
Create a new Class library project and , call it CassLibrary.
In the CassLibrary project, import the DataStax nuget package for the cassandra connector.
Create an object to hold our result rows
namespace CassLibrary { public class DTOExampleTable { public int Id { get; set; } public string Title { get; set; } public string Description { get; set; } } }
Create an Extension to convert row to object
namespace CassLibrary { public static class DataExtensions { public static IEnumerable<DTOExampleTable> ToExampleTables(this RowSet rows) { return rows.Select(r => new DTOExampleTable() { Id = int.Parse(r["tid"].ToString()), Title = r["title"].ToString(), Description = r["description"].ToString() }); } } }
Create a Simple Data class to hold the session connection and the retrieval of our data
namespace CassLibrary { public class Data { private string _ks; private string _cp; public Data(string contactPoint, string keyspace) { _cp = contactPoint; _ks = keyspace; } private ISession GetSession() { Cluster cluster = Cluster.Builder().AddContactPoint(_cp).Build(); ISession session = cluster.Connect(_ks); return session; } public IEnumerable<DTOExampleTable> GetExampleRows() { var s = GetSession(); RowSet result = s.Execute("select * from exampletable"); return result.ToExampleTables(); } } }
This is just a simple way of showing the data access. The cassandra plugin has a representation of LINQ also, but I’ll not go into it here.
Now, go back to the WCFService1 project, and add a new method to the Service Contract interface.
[ServiceContract] public interface IService1 { [OperationContract] IEnumerable<DTOExampleTable> GetExampleData(); }
And in the actual service, add the corresponding method. We’ll add some test data, then verify the service is set up correctly first.
public class Service1 : IService1 { public IEnumerable<DTOExampleTable> GetExampleData() { var dto = new List<DTOExampleTable>(); dto = new List<DTOExampleTable>() { new DTOExampleTable() { Id = 999, Title = "Just a test for WCF", Description = "WCF Desc test" }, new DTOExampleTable() { Id = 99, Title = "Just another test for WCF", Description = "WCF Desc test 2" }, }; return dto; } }
Right click the WCF project and start debugging
If the WCFTestClient doesn’t fire up, go to the Visual studio command prompt and type in
WCFTestClient.exe
Then attach your service URL to the client.
Once attached, select the GetExampleData Method in your service and invoke. You should see the two test items we added above.
Now that we know the service is fine, remove the test items from the service method, replacing them with the Data class in your CassLibrary.
public class Service1 : IService1 { public IEnumerable<DTOExampleTable> GetExampleData() { return new Data("127.0.0.1", "casswcfexample").GetExampleRows(); } }
Rebuild your service, and re-invoke it through WCFTestClient. You should see your Cassandra data.
The Cassandra client has DBContext and LINQ built in, so the example above should in no way be utilised in a real-life programming situation.
If i get a few hits on this page, I’ll post a more complete example, showing off the actual speed of Cassandra (a large cluster can serve hundreds of thousand of records a second). Cassandras only real competitor is MongoDB, which seemingly tops out at 20 nodes in a cluster.
e.g.
Its this throughput and stability in scaling that enabled Cassandra to be used in the Large Hadron Collider to store data as it came into one of the detectors.
Planet Cassandra : Companies Using Cassandra