Recentemente foi lançada a mais nova versão do Easy-Cassandra, que trouxe novidades no gerenciamento de múltiplos nós. O uso de muitos nós é interessante para o Cassandra, já que evita gargalos, garante a tolerância a falhas, elasticidade além do fato. Um grande número de nós faz com que o Cassandra distribua as requisições, salientando que esse tipo de banco possui uma arquitetura distribuída, ou seja, vale a pena utilizar um grande número de nós.
Tão logo se tenha múltiplos nós do Cassandra o próximo passo é estar dividindo as tarefas entre os mesmos, não adianta se possuir dez nós, por exemplo, se todas as requisições vão sempre para um. Feito isso, o banco tratará todo resto (replicar informação entre os nós, ler e escrever a partir do nível de consistência, etc.). A estratégia utilizada no Easy para aproveitar o máximo dos múltiplos nós, é fazer com que cada requisição use um cliente diferente, para isso ele terá duas formas:
Sequencial: cada nó recebe um número de ordem crescente que vai de 0 até N-1, em que N é o número instâncias do Cassandra. Feita essa numeração, para cada solicitação ao Cassandra (atualizar, criar, deletar) é usado um cliente diferente seguindo em ordem crescente, por exemplo:
- Primeira requisição cliente 0
- Segunda requisição cliente 1
Uma vez acabado o número de nós, essa ordem recomeça a partir do cliente de índice 0.
Randômico: de forma semelhante ao sequencial, é dado um número para cada cliente que vai de 0 até N-1. Após essa numeração, para cada requisição é criado um número aleatório que representa uma instância do Cassandra.
Para usar uma das duas estratégias no ORM, o processo é bastante simples:
O primeiro passo é criar instâncias do Cassandra. Depois, adicionar esses nós no Easy-Cassandra. Em seguida, criar uma das duas Estratégias informando o nome do keyspace. Caso não exista, o keyspace será criado.
Para demonstrar esse novo recurso será usado um simples exemplo: o seu objetivo será apenas recolher uma resposta de qualquer usuário para a seguinte pergunta: “O que você acha do Cassandra?”.
Para fazer esse exemplo utilizaremos o Tomcat como servidor, JSF (Java Server Faces) na visão e o Google Guice como injeção de dependência.
A injeção de dependência é um padrão de desenvolvimento muito conhecido no mundo Java, é ideal principalmente para manter baixo acoplamento entre diferentes camadas do sistema. Nesse modo o responsável por injetar esse recurso será o container de injeção, fazendo que algumas vezes o programador não saiba de onde vem tal recurso. O Google apresenta um framework open source para injeção de dependência, o Google Guice que atualmente está na versão 3.0.
O principal objetivo do Guice é ser bem leve em comparação ao Spring, além de não precisar de um grande número de XMLs (você consegue injetar dependência sem usar nenhum!). Outra informação bastante interessante é que nessa versão ele implementa a JSR 330. O Guice também trabalha na injeção de dependência em OSGI, Struts, Swing, JPA e também em Servlets. Trata-se de um kit completo de injeção de dependência para o desenvolvimento nas plataformas JEE, JSE e também Android com o RoboGuice (http://code.google.com/p/roboguice/).
Como o objetivo é estar apenas armazenando o usuário e sua pergunta, modelamos o objeto a ser salvo, que ficará do seguinte modo:
Listagem 1: Modelagem de objeto a ser salvo
@Entity
public class Post implements Serializable;
@Id
private String nickName;
@Column
private String text;
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
Nele se encontram dois atributos: o primeiro representa o nome do usuário, que será a chave para o Cassandra, e o segundo será a sua resposta.
Estaremos usando os qualificadores do Google Guice, a ideia é que a partir da anotação seja definido o tipo de persistência sequencial e randômico. Conforme mostra a Listagem 2.
Listagem 2: Definição dos qualificadores
@BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
public @interface Random {}
@BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
public @interface Sequencial {}
Dessa maneira torna-se fácil definir qual é o tipo de persistência a ser utilizado. Os qualificadores são feitos a partir de uma anotação.
Listagem 3: Injetando os serviços e definido a implementação de cada persistência
public class PersistenceService {
@Inject @Sequencial
private ServiceClient sequencialClient;
@Inject @Random
private ServiceClient randomClient;
public ServiceClient getRandom(){
return randomClient;
}
public ServiceClient getSequencial(){
return sequencialClient;
}
}
A criação dos dois tipos é bastante semelhante, o primeiro é adicionando os hosts, feito isso já se pode chamar qualquer uma das formas de estratégia de persistência conforme mostra a Listagem 3.
Listagem 4: Adicionando nodes
EasyCassandraManager.getPersistence("javabahia", "localhost", 9160);
EasyCassandraManager.getPersistence("javabahia", "node2", 9160);
EasyCassandraManager.getPersistence("javabahia", "node3", 9160);
EasyCassandraManager.addFamilyObject(Post.class);
Na Listagem 4 estamos adicionando nodes para que o Easy-cassandra consiga gerenciar as instâncias do banco e, em seguida, adicionando a classe para que essa possa ser gerenciada a partir de JPQL (Java Persistence Query Language).
O código desenvolvido fornece duas opções de inserir sua resposta: uma sequencial e uma randômica e tão logo é inserida a informação, ela é recuperada e lançada em forma de lista das duas formas.
Nesse pequeno artigo foram apresentadas duas estratégias para a persistência com multi-nodes usando o Easy-Cassandra. A ideia principal foi demonstrar a importância de compartilhar os trabalhos com as outras instâncias, já que não adianta possuir muitos nós e todas as requisições ficarem apenas em um deles, gerando todo o gargalo. Além disso, foi demonstrado um pouco dos recursos do Google Guice e sua integração com o framework.
Para maiores informações sobre o Easy-Casandra e o Google Guice, acesse os links:
- https://github.com/otaviojava/Easy-Cassandra/wiki
- http://code.google.com/p/google-guice/
- //www.devmedia.com.br/conhecendo-o-projeto-easy-cassandra-java/23701
Espero que as informações apresentadas possam ser úteis. Até a próxima.