Lançada a mais nova versão do framework Easy-Cassandra seu objetivo é estar facilitando a comunicação entre Apache Cassandra e sua aplicação em java. Com ele é possível esta criando, atualizando, recuperando ou deletando os seus objetos java de uma maneira bastante simples, para isso basta apenas realizar anotações na classe e nos campos.

CARACTERÍSTICAS

  • Uma espécie de ORM para o Cassandra
  • Precisa apenas de anotações na classe para persistir informações
  • Persiste muito objetos java de uma maneira bastante fácil
  • Escreve e ler no Cassandra com Level Consistency.
  • O primeiro compatível com versões acima do Cassandra 0.8
  • Compatível com CQL 2.0
  • O primeiro a usar invokedynamic ao invés de Reflection
  • Sob a licença Apache versão 2.0
  • Suporte aos seguintes objetos

As novidades nessa versão:

  • Criação de Famílias de colunas e índices secundários em tempo de execução
  • Suporte ao CQL 2.0
  • suporte a chamada de chaves com 'in'

Para demonstrar essa nova versão será apresentado um exemplo prático com uma aplicação simples. Essa aplicação terá o objetivo de armazenar informações da média de renda dos brasileiros agrupados por CEP, a ideia seria saber quanto é gerado em reais e o número de entidades comerciais ( padarias, mercados, mercadinhos, açougues etc.) que geram esse valor em um determinado local, CEP. Assim será armazenado aproximadamente 640 mil informações a cada levantamento de estudo.

Cada requisição para o estudo terá as seguintes informações:
  • Código do Lote
  • Quantidade de pessoas calculadas no setor CEP
  • Valor computado
  • Cidade
  • Logradouro
  • Bairro
  • Cep
  • Tipo do logradouro
  • Estado
  • Sigla

Para armazenar essas informações será utilizado o banco nosql Cassandra que é:

  1. Altamente confiável: Utilizado por diversas empresas entre elas Cisco, Reddit, Twitter. O maior cluster conhecido do Cassandra possui mais de 300 tb em 400 máquinas .
  2. Tolerante a falhas: Os dados são replicados automaticamente para múltiplos nós para a tolerância a falhas.
  3. Descentralizado: Já que não existe ponto de falha nem gargalhos de rede. Já que cad nós é idêntico .
  4. Configurável: Se pode escolher de uma maneira bastante simples se será uma atualização síncrona ou assíncrona além de possuir Hinted Handoff e Read Repair .
  5. Escalável: Com ele tanto a escalabilidade horizontal e vertical poderão ser feitas de uma maneira bastante simples. Além de adicionar novas máquinas podem ser adicionadas sem tempo de interrupção .
  6. Durável: Foi projeto para não perder informações mesmo quando vários nós falham.

Para facilitar o desenvolvimento será utilizado o Easy-Cassandra que funcionará como uma camada de acima do Thrift facilitando as chamadas para o Cassandra, aumentando a produtividade além de deixar o código mais limpo. Para seu funcionamento é necessário baixar a lib do framework além de suas dependências (mais informações no final do artigo). Para facilitar o gerenciamento dessas lib nesse exemplo será utilizado o maven, para ter acesso o projeto é necessário adicionar o repositório além da tag da lib conforme mostra a tabela 1.

Lisatgem 1: chamada do repositório e chamada da lib do Easy-Cassandra


   
        org.easycassandra
        EasyCassandra
        1.0.8
   

   

   

 
  
    
        easycassandra
        http://otaviojava.googleCODE.com/svn/repository/
    
  


Cada requisição representará uma linha no Cassandra que pode varia o seu tamanho de linha por linha. Assim mapeando as requisições com as anotações ficará de acordo com a tabela 2.

Listagem 2: Mapeamento das classes para o controle de renda por cep


@ColumnFamilyValue(name = "controle")
public class ControleRenda implements Serializable {

    @KeyValue(auto = true)
    private Long id;
    @EmbeddedValue
    private Endereco endereco;
    @ColumnValue(name = "valor")
    private Double valor;
    @ColumnValue(name = "quantidade")
    private Long quantidade;
//getter and setter
}

public class Endereco implements Serializable {

    @ColumnValue(name="cidade")
    private String cidade;
    
    @ColumnValue(name="logradouro")
    private String logradouro;
    
    @ColumnValue(name="bairro")
    private String bairro;
    
    @IndexValue
    @ColumnValue(name="cep")
    private String cep;
    
    @ColumnValue(name="tp_logradouro")
    private String tp_logradouro;
    
    @ColumnValue(name="estado")
    private String estado;
    
    @ColumnValue(name="sigla")
    private String sigla;
// getter and setter
}

Ao ver a tabela 2 na classe Endereço existe a anotação @IndexValue no campo cep, essa anotação faz com que esse campo seja um índice secundário, um campo que além da chave pode recuperar informações dentro da linha. Com isso nessa linha além do código de controle ( coluna chave) a linha pode ser recuperada pelo cep ( campo chave secundária).

Para simular essas requisições foi utilizado um arquivo texto com aproximadamente 640 mil linhas. Cada linha possui as informações separado por pipe '|'.

Para rodar o nosso exemplo é necessário que o Cassandra esteja rodando já que tanto a família de colunas tanto a chave secundária serão criados em tempo de execução graças ao um recurso da nova versão.

Listagem 3: Novo Recurso

create keyspace renda;
Assim basta executar a aplicação e todas as informações estarão persistiradas no cassandra. De fato existe inúmeras maneiras de aumentar a performance do cassandra (configurando o GC, configurando o heap, aumentando o número de nós e clusters, etc.), mas nesse exemplo foi mostrado usando os recursos padrões.

Nesse artigo foi demonstrado um exemplo prático utilizando o Easy-Cassandra 1.0.8 junto com o maven, realizando um programa simples com 640 requisições. Foi demonstrado alguns novos recursos como a criação da família de coluna e a chave secundária em tempo de execução.

Referências:

Easy-Cassandra: Easy-Cassandra
Documentação, lib e código exemplo (Maven_Example.rar): Download Easy-Cassandra
wiki: Easy-Cassandra wiki