Por que eu devo ler este artigo:A utilização de um framework de distribuição de dados pode aumentar consideravelmente a performance de uma aplicação.

Neste cenário, escolher o framework que melhor se adeque à nossa aplicação se mostra uma tarefa complexa e que pode simplificar ou dificultar uma implementação.

Com base nisso, este artigo apresentará o Hazelcast, uma ferramenta para computação distribuída que certamente propiciará um grande diferencial para os seus projetos de software.

O mundo tecnológico está sempre em evolução, e neste mesmo caminho, as aplicações, sejam elas corporativas ou não, necessitam cada vez mais de velocidade de processamento, visto que o volume de informações a ser processado também continua aumentando e o tempo de resposta ao usuário, diminuindo.

Neste contexto, um dos grandes problemas ao desenvolver uma aplicação é que muitas vezes não sabemos a proporção que esta tomará um dia.

Tomando como exemplo o Facebook, quando desenvolvido, o intuito era apenas de ser um canal de relacionamento utilizado dentro da faculdade e pelos alunos.

Contudo, com o passar do tempo e com a popularização da aplicação, os desenvolvedores enxergaram uma oportunidade e aumentaram a abrangência da mesma.

É sabido que, quanto maior a aplicação e quanto mais usuários ela tiver, maior será o número de informações a serem processadas.

Para suprirmos este crescimento de maneira a evitar problemas, temos duas opções: escalar verticalmente e escalar horizontalmente a aplicação. Ao escalar verticalmente, estamos adicionando mais recursos em um único nó, ou seja, adicionando memória, processamento, espaço físico, etc.

No entanto, muitas vezes esta opção se mostra inviável, já que adiciona mais custos ao projeto e a máquina em si possui um limite próprio, chegando a um ponto em que seria necessário trocar todo o servidor para suprir a demanda da aplicação.

O outro modelo de escalabilidade, horizontal, tem o princípio de adicionar mais nós de uma aplicação ao sistema. Chamado de cluster, este conjunto de aplicações passa a interagir de maneira integrada, compartilhando, por exemplo, filas, cache, processamento, etc.

Apesar de ser necessária uma mão de obra para adaptar a aplicação, a escalabilidade horizontal torna sua aplicação mais robusta para suprir esta volatilidade de volume de processamento sem aumentar muito o custo de seu projeto.

Quando desenvolvemos aplicações distribuídas, estamos fazendo uso deste segundo conceito de escalabilidade e assim possibilitando que nossa aplicação se adeque à demanda de processamento, podendo adicionar ou remover nós (máquinas/servidores) quando necessário sem implicar manutenções ou alterações no código.

Além deste ganho relacionado àperformance, aplicações distribuídas também possuem mais disponibilidade, de forma que o processamento de informações não é mais dependente de uma única máquina. Em um cenário distribuído, teremos vários nós em condições de atender a requisição, o que torna nossa aplicação muito mais confiável.

Hazelcast

Atualmente existe uma série de ferramentas no mercado que auxiliam no desenvolvimento de aplicações distribuídas. Desta forma, a escolha da ferramenta ideal deixa de ser uma tarefa fácil, pois cada uma das opções possui particularidades, pontos fortes e fracos. Neste artigo vamos conhecer uma delas, o Hazelcast.

Optamos por esta ferramenta porque ela se mostrou bastante completa e simples de integrar com outras aplicações.

Apesar de possuir uma versão community (grátis e mantida pela comunidade), o Hazelcast também possui uma versão entreprise, que traz alguns benefícios relacionados à segurança, suporte, etc. Ainda assim, no artigo adotaremos a versão community, de fácil acesso a todos.

O Hazelcast é uma ferramenta open source escrita em Java, especializada em computação distribuída e que traz uma série de componentes que possibilitam a distribuição de dados e processamento. Sim, você entendeu corretamente, o Hazelcast fornece uma maneira de distribuirmos o processamento de dados entre os nós, a qual será abordada ao longo desse artigo.

Para a distribuição de dados, temos mapas, multi-mapas e coleções, por exemplo. Já para a distribuição e controle de processamento podemos usar locks e mensageria.

Esta solução provê também algumas vantagens, como clientes em C++ e C#, além de funções bastante úteis como a replicação de dados em diferentes lugares, característica que eles chamam de WAN Replication.

Como veremos, escalabilidade e alta disponibilidade são as principais características que o Hazelcast propicia e que contribuem para o desenvolvimento de uma sólida aplicação distribuída.

Com base nisso, este artigo abordará como podemos fazer uso das coleções distribuídas que o Hazelcast provê, além dos tão utilizados Map e Multimap.

Abordaremos ainda como empregar o Hazelcast como solução de mensageria, bem como mostrar como distribuir a carga das aplicações a partir do seu Executor Service e também utilizar o Hazelcast num contexto transacional utilizando Transactions, entre outras particularidades da ferramenta.

A instalação

A instalação do Hazelcast é bastante simples, basta realizar o download no site do projeto (veja o endereço na seção Links) e extrair seu conteúdo em uma pasta de sua preferência.

Feito isso, execute o arquivo run presente na pasta bin, como podemos visualizar na Figura 1. Você pode fazer isso em qualquer sistema Unix ou Windows que possua o JDK configurado.

abrir imagem em nova janela

Figura 1. Iniciando um nó do cluster.

A cada execução deste arquivo será iniciada uma nova instância do Hazelcast, informando em que IP o servidor está executando e quantos e quais nós estão presentes no cluster.

Agora, por exemplo, se rodarmos mais uma vez este arquivo, iniciaremos mais um servidor do Hazelcast que será incluído automaticamente no cluster e trabalhará em conjunto com a instância anterior. Podemos observar este comportamento na Figura 2.

abrir imagem em nova janela

Figura 2. Iniciando vários nós de um cluster.

Em sua configuração padrão o Hazelcast utiliza UDP para realizar o discovery das máquinas na rede local e assim poder adicioná-las ao cluster.

Para realizar esse discovery é realizado um multicast na rede. No entanto, dependendo da necessidade da aplicação, talvez a utilização de UDP e multicast não seja a melhor solução. Por isso o Hazelcast também disponibiliza a forma de comunicação e discovery via TCP/IP, na qual você pode pré-definir quais máquinas farão parte do cluster. Falaremos mais sobre isso no final do artigo.

Nota: Caso você queira montar um cluster com o Hazelcastutilizando seu standalone, você pode inicializá-lo pelos executáveis que ele dispõepara ter uma configuração mais específica para o cache, tempo de expiração, etc., você deve editar o arquivo hazelcast.xml. Para mais informações sobre a configuração deste arquivo, veja o endereço indicado na seção Links.

Outra forma de iniciar um servidor Hazelcast é de dentro da aplicação. Para isto, basta adicionar a lib do Hazelcast no classpath do projeto e executar os seguintes comandos:

Config config = new Config();
HazelcastInstance h =
Hazelcast.newHazelcastInstance(config);
Quer ler esse conteúdo completo? Tenha acesso completo