• Nenhum resultado encontrado

2.2 Plataformas de integração

2.2.2 Motor de Execução

Os motores de integração adotam como política de agendamento de tarefas as heurísticas de prioridade e a FIFO, além disso, utilizam a API Executor do Java para criar um pool global de threads, para fazer a alocação dos recursos computacionais para a execução dos processos de integração, dado que, as threads são utilizadas para processar as tarefas que compõe o fluxo de integração dos processos.

O motor de execução de uma plataforma de integração é o responsável em proporcionar o suporte essencial à execução de uma solução de integração. O núcleo do motor de execução, é construído com a API Executor, sendo considerado a parte central e mais importante do mesmo, visto que, ele o responsável pela coordenação das atividades que fazem parte de uma instância executada. Este elemento central do motor de execução também é

22 Capítulo 2. Revisão da Literatura

o responsável por executar as tarefas que vêm do fluxo da solução de integração, e possui em execução uma fila de tarefas, um conjunto dethreads

e três monitores [17].

O motor de execução interpreta um processo de integração implementado, executando as tarefas do processo por meio de recursos computacionais presentes neste motor, dentre as quais estão as threads de execução [57]. As

threads são usadas para proporcionar que as tarefas sejam executadas de forma simultânea, por meio da programaçãomultithreads [12].

Até a versão 5.0 do Java, seus recursos oferecidos deixavam sob a responsabilidade do programador a gerência dasthreads para os programas. No entanto, a versão 5.0 já inclui o pacote API Executor, que conta com recursos para auxiliar na utilização das threads [56]. As classes dessa API fornecem configurações que dão flexibilidade para pools dethreads, que vão desde indicar o número máximo de threads mantidas no pool sem executar, até o número máximo de threads permitidas no pool, entre outras, como o tipo de fila que será usada para manter as tarefas antes da execução.

Há várias opções de filas de tarefas na concurrency API do Java, que atendem a diferentes necessidades como: mensageria, produtor-consumidor, tarefas paralelas e assim por diante [56]. Nas plataformas de integração o estilo de integração segue um sistema de mensageria, assim, durante a execução de uma solução de integração, a fila de tarefas (work queue) segue o preceito de que o primeiro elemento que entra será o primeiro elemento a ser executado (FIFO).

A fila de tarefas deve armazenar as unidades de trabalho (work units), que são anotações referentes as tarefas que devem ser processadas e quando estas tarefas podem ser executadas. Em geral as tarefas são executadas o mais rápido possível, no entanto, é possível definir um tempo específico para que uma tarefa seja executada, o que auxilia na implementação de tarefas que precisem ser executadas seguindo alguma periodicidade [19].

Os recursos computacionais presentes no motor de execução e que permitem executar um programa são as chamadas threads. Considerando o contexto do motor de execução, asthreads representam o quanto de recurso computacional esta sendo alocado para processar as unidades de trabalho presentes na fila de tarefas [18]. Deste modo, sempre que chegarem novos elementos na fila de tarefas, as threads são informadas e concorrem para executar a unidade de trabalho.

A thread então consulta se a unidade de trabalho pode ser executada instantaneamente, se possível, a thread retira ela da fila para que a mesma

2.2. Plataformas de integração 23

possa ser executada. Caso a unidade de trabalho não possa ser executada imediatamente, ela permanece na fila, enquanto a thread entra em estado de espera enquanto não há uma nova entrada na fila de tarefas. Esta estratégia permite que as threads continuem trabalhando desde que exista uma tarefa pronta para ser executada [19].

Os monitores coletam e fornecem estatísticas sobre o uso da memória, da CPU e da fila de trabalho. O monitor de memória registra informações sobre como o sistema está utilizando a memória. O monitor dasthreads registra o tempo utilizado pelas threads na execução de unidades de trabalho, bem como o tempo de execução do sistema. O monitor da fila registra o tamanho da fila e o número total de unidades de trabalho que foram processadas. Os monitores foram implementados como threads independentes que são executados em intervalos regulares, coletam as informações anteriores, armazenam-na em um arquivo e ficam ociosas o mais rápido possível [16].

O Executor é iniciado a partir do carregamento e análise do seu arquivo de configuração da inicialização do sistema de log e da criação de uma fila de tarefas. O arquivo de configuração do Executor tem formato XML [8], e determina circunstâncias importantes como o número de threads que o motor vai utilizar, onde os monitores devem escrever as estatísticas geradas durante a execução, qual deve ser a periodicidade que será realizado o monitoramento e o arquivo de log devem ser reportadas as advertências e exceções que podem acontecer no decorrer da execução. Tendo inicializado o

Executor, o motor de execução pode ser inicializado de acordo com o Engenheiro de Software responsável, assim, quando o motor é iniciado, as

threads e monitores também são ativados [19].

As threads são iniciadas de forma assíncrona, implementando um ciclo que permite que as threads pesquisem a fila de tarefas enquanto a execução da solução de integração não estiver parada. O processamento de uma unidade de trabalho requer a execução de operação de invocação na tarefa associada, e para cada notificação de tarefa que o Executor recebe, o mesmo cria uma nova unidade de trabalho e anexa-a à fila de trabalho [16].

A partir da compreensão doExecutor podemos visualizar na Figura2.7o funcionamento do motor de execução. A fila de tarefas recebe por meio de uma entrada as unidades de trabalho, ou tarefas (T1,T2). Estas tarefas são provenientes de uma solução de integração, que apesar de possuir um fluxo de integração definido, tem uma distribuição aleatória para as entradas, isto é, podem entrar novas tarefas a qualquer momento. Para executar estar unidades de trabalho estão disponíveis um conjunto de threads, que após

24 Capítulo 2. Revisão da Literatura

Figura 2.7:Modelo conceitual do motor de execução.

executar a tarefa devolvem a mesma para a fila de tarefas que encaminha a tarefa concluída para a saída, seguindo este processo a cada novas entradas de tarefas [19].

Segundo estudos experimentais, a arquitetura pool de threads pode trazer um impacto no desempenho [2], visto que para manter os recursos computacionais trabalhando de forma eficiente, os mesmos devem acompanhar a carga de trabalho requisitada [10]. O tamanho do pool têm uma relação de dependência com o processo de integração à ser executado, assim a configuração do motor de execução é fundamental para garantir que o processo de integração tenha um bom desempenho, ou seja, para que possa alcançar as condições de serviço que o usuário necessita. Neste sentido, configurar o motor diz respeito à destinar a quantidade ideal de threads no pool, para atender aos requisitos solicitados. Sendo que, atualmente esse processo de dimensionamento do pool de threads é feito com base no conhecimento empírico dos engenheiros de software.

Documentos relacionados