Cluster

O jmine-tec-cluster é o módulo do Jmine que permite que várias instâncias de um sistema se conheçam com configuração mínima, elegendo uma máquina mestre para a execução de tarefas específicas. Um cenário bastante comum é utilizar a máquina mestre para executar (ou disparar) tarefas agendadas, que precisam ser executadas por somente um dos nós disponíveis, independentemente de qual. A identificação de novos nós e a eleição de mestres é automática, permitindo um ambiente elástico e tolerante a falhas.

Abordagem Clássica

Quando precisamos executar tarefas agendadas é comum separarmos um servidor específico para elas, dependendo do caso, podemos até mesmo agendar nos servidores que estão os nossos produtos. Veja a imagem a seguir:

../../_images/Agendamento-clássico.png

O problema com esta abordagem é a dependência de um ambiente específico, o que dificulta bastante o gerenciamento e a própria manutenção das tarefas. No exemplo acima, temos N tarefas em uma máquina específica para isto, e uma tarefa configurada em uma das máquinas do sistema. Caso seja necessário realocar máquinas também será necessário migrar os agendamentos, e, considerando que nem sempre eles estão centralizados, corremos o risco de perder informação no meio do caminho. Essa abordagem também é vulnerável a falhas na máquina de tarefas, pois não há redundância, além de tornar necessário o geranciamento de configurações heterogêneas.

Quartz

Outra abordagem comum no mundo Java é utilizar o Quartz. Ele permite que sua aplicação execute tarefas com uma frequência determinada na própria aplicação. Assim você pode centralizar as informações sobre agendamentos na sua aplicação, e elas serão executadas onde a aplicação estiver rodando.

Um dos problemas desta abordagem é quando sua aplicação sobe em um cluster, neste cenário todas as máquinas tentarão executar a tarefa cadastrada.

../../_images/Agendamento-quartz.png

Jmine Cluster

O componente jmine-tec-cluster permite distribuir tarefas em um Cluster de máquinas , garantindo que somente um conjunto específico de máquinas execute tarefas agendadas. Veja a imagem abaixo sua estrutura:

../../_images/Agendamento-jmine-cluster.png

Repare que usando a estrutura que o cluster fornece, é possível ter o controle sobre quais nós a tarefa será executada, isto permite que somente um nó execute uma determinada tarefa, ou que todos eles executem a mesma tarefa. Este componente permite controlar completamente as tarefas e distribuí-las de acordo com a nossa necessidade em nosso cluster.

Nós

O conceito mais básico do Jmine-Cluster é representado pela entidade ClusterNode, ou seja, um nó. Um nó representa uma máquina disponível no cluster para ser utilizada pelas tarefas do projeto. Toda vez que uma instância é inicializada, ela se cadastra no registro de nós disponíveis.

O nó mestre

Dentre todos os nós cadastrados existe sempre um que é considerado o nó mestre, ele será sempre o nó com menor ID (no banco de dados) cadastrado. Existe uma condição cadastrada no Jmine-Scheduling chamada onlyMasterNodeCondition que só executa em um nó marcado como mestre, assim temos uma forma simples de garantir que somente um dos nós execute tarefas.

Qualquer um dos nós disponíveis pode assumir o papel de mestre caso ele caia. Quando isto ocorrer, o próximo nó de menor ID será considerado mestre.

Heartbeat

O heart beat pode ser entendido como um tipo de ‘ping’ que todos os nós executam. Eles incrementam um contador específico no registro do próprio nó.

Validação de nós

Existe uma verificação a cada 3 segundos que verifica se todos os nós estão com seu contador atualizado, caso algum fique fora de sincronização, significa que ele não está mais disponível e seu registro será removido do banco.

Caso um nó removido volte a ficar online, ele mesmo cuidará de se registrar novamente como um nó disponível do cluster.

Configuração

As tarefas que atualizam o ‘ping’ de cada máquina e que removem seu registro do cluster se desatualizados são executados usando um serviço de agendamento. É possível usar qualquer framework para isto, mas fornecemos configuração default para o Quartz, do Spring Framework. Para que estas tarefas comecem a executar é necessário importar o arquivo jmine-tec-cluster-config-quartz.xml:

<import resource="classpath:jmine-tec-cluster-config-quartz.xml" />

Exemplo

O projeto de exemplo Scheduling-Example, disponível em nosso repositório, mostra como configurar sua aplicação para usar a estrutura de Cluster e executar uma tarefa no nó mestre.