Para uma demonstração simples de como desenvolver um EndPoint de get/set com o Cassandra em .NET, utilizei a biblioteca Aquiles v0.6.4.2 (http://aquiles.codeplex.com/), que mesmo com pouca documentação, permite uma implementação fácil e bem intuitiva.
Por que criarei um EndPoint/WebService? Pois WebServices permitem facil interação com qualquer aplicação independente de plataforma.
O primeiro passo foi adicionar e referenciar as DLLs da biblioteca em um projeto Web Service:
Configurei o web.config, de acordo com meu cenário (onde o Cassandra esta no ‘localhost’, porta 9160):
<configSections> ... <section name="aquilesConfiguration" type="Aquiles.Configuration.AquilesConfigurationSection,Aquiles"/> </configSections> <aquilesConfiguration> <clusters> <add friendlyName="LocalCassandra"> <connection poolType="SIZECONTROLLEDPOOL" factoryType="BUFFERED"/> <endpointManager type="ROUNDROBIN" defaultTimeout="6000"> <cassandraEndpoints> <add address="localhost" port="9160"/> </cassandraEndpoints> </endpointManager> </add> </clusters> </aquilesConfiguration>
E criei um WebService bem simples utilizando o keyspace ToyStore do artigo anterior:
using System; using System.Web.Services; namespace CassandraEndPoint { using Aquiles.Command; using Aquiles; using Aquiles.Helpers.Encoders; [WebService] public class wsToyStore : WebService { const string cassandraConn = "LocalCassandra"; const string columnFamily = "Toys"; const string keyspace = "ToyStore"; [WebMethod] public string GetToyColumn(string key, string columnName) { AquilesHelper.Initialize(); var cmd = new GetCommand { KeySpace = keyspace, ColumnFamily = columnFamily, Key = key }; cmd.ColumnName = ByteEncoderHelper.UTF8Encoder.ToByteArray(columnName); using (var connection = AquilesHelper.RetrieveConnection(cassandraConn)) { connection.Open(); connection.Execute(cmd); connection.Close(); } if (cmd.Output == null) return string.Empty; var bytes = cmd.Output.Column.Value; var value = ByteEncoderHelper.UTF8Encoder.FromByteArray(bytes); return value; } [WebMethod] public void SetToyColumn(string key, string columnName, string value) { AquilesHelper.Initialize(); var cmd = new InsertCommand { KeySpace = keyspace, ColumnFamily = columnFamily, Key = key }; cmd.Column = new Aquiles.Model.AquilesColumn() { ColumnName = ByteEncoderHelper.UTF8Encoder.ToByteArray(columnName), Value = ByteEncoderHelper.UTF8Encoder.ToByteArray(value), Timestamp = DateTime.Now.Ticks }; using (var connection = AquilesHelper.RetrieveConnection(cassandraConn)) { connection.Open(); connection.Execute(cmd); connection.Close(); } } } }
E como resultado, o método SetToyColumn para inserir ou alterar o valor de uma coluna.
E o método GetToyColumn, para recuperar estes valores:
A biblioteca mais low-level que pode ser encontrada para trabalhar com Apache Cassandra e C# é a Thrift, mas podem ser encontradas outras mais high-level que até têm suporte á LINQ, como a Cassandraemon.
Abaixo a relação de bibliotecas:
Thrift:
http://incubator.apache.org/thrift
Aquiles:
http://aquiles.codeplex.com
Hector Sharp:
http://www.hectorsharp.com
Fluent Cassandra:
http://github.com/managedfusion/fluentcassandra
Cassandraemon:
http://cassandraemon.codeplex.com