Essa é uma revisão anterior do documento!
RabbitMQ
RabbitMQ é um software de código aberto (open source) que foi implementado para suportar um protocolo de mensagens denominado Advanced Message Queuing Protocol (AMQP). Através da solução, é possível criar uma aplicação para lidar com o tráfego de mensagens que estão no cerne de sistemas de informação. A ideia do RabbitMQ é disponibilizar uma estrutura que facilite fluxos de mensagens, sobretudo em grandes aplicações, para a comunicação entre todos os processos. A solução foi desenvolvida pela empresa Rabbit Technologies Ltd., que o lançou em 2007. Em 2010, foi adquirida por SpringSource, uma divisão da VMware.
Configuração de Microservices
Este tópico visa demonstrar a implementação do RabbitMQ para processamento de dados em uma arquitetura em Microservices. O documento de Arquitetura de Microservices do TCE-GO, apresenta a proposta de solução para a infraestrutura de processamento distribuído, Cloud Computing, do TCE-GO. Partindo dessa especificação de arquitetura da informação, a especificação da funcionalidade de processamento em Microservices será dividido nas seguintes etapas:
Configuração do Serviço de Mensagem RabbitMQ
A solução de processamento distribuído (Cloud Computing) do TCE-GO, utilizará o framework RabbitMQ (https://www.rabbitmq.com) na versão 3.6.4.1.
O RabbitMQ disponibiliza um servidor de mensagem que está acessível pelo protocolo de mensagem do framework .Net, AMQP (Advanced Message Queueing Protocol). Esse servidor de mensagem precisa ser instalado em um sistema operacional que deverá estar disponível e acessível na rede de computadores do TCE-GO.
O servidor RabbitMQ do TCE-GO, será configurado em uma máquina virtual, controlada e mantida pela Gerencia de TI (GER-TI). Essa máquina virtual será instalado o sistema operacional CentOS na versão 6.7, com recurso computacional de 2 GB de memória RAM e 20 GB de disco rígido.
Conforme as especificações do fornecedor da solução RabbitMQ, os recursos computacionais exigidos para a instalação do servidor são as seguintes:
- Memória RAM:
- No mínimo 128 MB;
- 75% da configuração do limite de uso da memória RAM para máquina com memória até 4 GB;
- 80% da configuração do limite de uso da memória RAM para máquina com memória entre 4 GB e 8 GB;
- 85% da configuração do limite de uso da memória RAM para máquina com memória entre 8 GB e 16 GB;
- 90% da configuração do limite de uso da memória RAM para máquina com memória superior a 16 GB.
- Memória Fisica (Hard Disc):
- No mínimo 2 GB;
- 50% para máquinas com disco rígido entre 1 a 8 GB;
- 40% para máquinas com disco rígido entre 8 a 32 GB;
- 30% para máquinas com disco rígido acima de 32 GB.
A configuração padrão do servidor RabbitMQ define que a utilização do recurso de memória da máquina será de 40% da memória RAM. Essa configuração poderá ser alterada através do arquivo de configuração de nome rabbitmq.config, que deve ser criado no seguinte caminho em /etc/rabbitmq/. Nesse arquivo de configuração a o conteúdo que se deve alterar está escrito semelhante ao apresentado abaixo:
[{rabbit, [{vm_memory_high_watermark, 0.4}]}].
Conforme descrito acima, o percentual de memória utilizado por padrão é de 0.4, correspondente a 40%. Para aumentar ou diminuir esse valor deve ser alterado em valor decimal, o percentual de limite de memoria deseja que o servidor RabbitMQ poderá utilizar. Outras formas de configurações do uso da memória RAM, estão disponíveis no site do fornecedor da solução RabbitMQ, através do seguinte endereço https://www.rabbitmq.com/memory.html.
Instrução de instalação do servidor RabbitMQ
O fornecedor da solução RabbitMQ, em seu web site, disponibiliza as instruções para instalação em diversos sistemas operacionais (https://www.rabbitmq.com/download.html). Utilizamos como base essas instruções, porem alguns ajustes foram necessários para a instalação da solução no sistema operacional que a GER-TI escolheu para hospedar esse serviço, o CentOS na versão 6.7. Dessa forma, abaixo estão descritas as instruções utilizadas para a instalação do RabbitMQ Server na versão 3.6.4.1:
- Instalação da biblioteca Erlang:
Antes da instalação propriamente dita da biblioteca Erlang, primeiro é necessário definir os repositórios da dependência em questão, bem como das dependências que esta necessita para ser instalada. Para isso foi necessário registrar os seguintes repositórios:
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm sudo rpm –Uvh remi-release-6*.rpm epel-release-6*.rpm
Após a instalação e registros das bibliotecas remi e epel, deverá ser instalada a biblioteca Erlang, sendo que a versão compatível com o RabbitMQ na versão 3.6.4.1 é a versão R16B03 ou superior. A instalação é feita executando o comando abaixo:
yum install –y erlang yum install –y esl-erlang
Instalação do servidor RabbitMQ
O servidor de mensagens RabbitMQ utilizado na infraestrutura de Cloud Computing do TCE-GO, será o servidor na versão 3.6.4.1. Entretanto, o mantenedor da solução RabbitMQ está evoluindo a solução constantemente, provável que neste momento a última versão disponibilizada do RabbitMQ seja outra.
Ante ao exposto por motivos de compatibilidade, os instaladores da solução RabbitMQ na versão 3.6.4.1 (plataforma Linux base RPM e Derbian) e na versão 3.6.4 (plataforma Windows) estão sendo mantidos no pela rotina de backup na pasta F:\BACKUP_RABBITMQ do fileserver.
A instalação deverá executar os seguintes comandos:
wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.4/rabbitmq-server-3.6.4-1.noarch.rpm rpm –-import http://www.rabbitmq.com/rabbitma-signing-key-public.asc yum install rabbitmq-server-3.6.4.1.noarch.rpm
Em algumas situações, caso alguma dependência da ferramenta RabbitMQ não seja localizada na instalação, o que pode interromper a instalação, pode ser resolvido esse problema fazendo a atualização do sistema operacional. Para isso, deverá ser executado o seguinte comando:
yum –y update
Inicializando o serviço RabbitMQ
Para inicializar (start) no servidor RabbirMQ, ou parar (stop), ou reiniciar (restart) ou outros, é possível realizar com a execução do comando:
/sbin/service rabbitmq-server stop/start/restart/etc.
Habilitando as portas de comunicação dos serviços de mensagens do RabbitMQ
Para habilitar as portas de comunicação TCP dos serviços de mensagens do servidor RabbitMQ, deverão ser executados os seguintes comandos:
ps faux | grep –I rabbitmq | grep –v grep netstat –an | grep –E “(4369|25672|5672|5671|15672|61613|61614|1883|8883)”
Habilitado os plug-ins de gerenciamento dos serviços RabbitMQ
O servidor RabbitMQ por padrão instala alguns plug-ins de gerenciamento e controle dos serviços de mensagens, como por exemplo o plug-in web site RabbitMq-Managment, no qual pode ser controlado os usuários que tem acesso ao serviço de mensagens e o tipo de perfil de cada usuário (Administrator, Monitoring, Policymaker, Management ou Nenhum).
Para habilitar o plug-in RabbitMQ-Management, deve ser executado o seguinte comando:
# listando os plug-ins disponíveis rabbitmq-plugins list # habilitando a porta de nº 15672 netstat –ant | grep 15672 # habilitando o plug-in RabbitMQ-Management rabbitmq-plugins enable rabbitmq_management
Criando um usuário no RabbitMQ-Managment
O servidor RabbitMQ por padrão vem configurado com um usuário cujo nome do usuário é guest e senha guest também. Caso não consiga acessar o ambiente web do plug-in RabbitMQ-Management, pelo usuário padrão guest, é possível incluir um usuário no servidor pelo shell do sistema operacional CentOS onde foi instalado o RabbitMQ, executando os seguintes comandos:
# listar os usuários rabbitmqctl list_users # criando usuário teste de senha teste321 rabbitmqctl add_user teste teste321 # dando permissão de perfil Administrator para o usuário teste rabbitmqctl set_user_tags teste administrator # habilitando permissão de acesso geral dos serviços de mensagens rabbitmqctl set_permissions –p / teste “.*” “.*” “.*”
Na configuração da máquina virtual rabbitmq, foi criado um usuário administrador cujo nome do usuário é admin e a senha é gerti_admin@321, para que a GER-TI possa configurar e manter os serviços de mensagens do servidor RabbitMQ, disponível na página web http://rabbitmq:15672/.
Para testes e homologação das soluções que utilizaram essa infraestrutura de serviço de mensagens, foi configurado e disponibilizado um ambiente de homologação, cujo servidor é http://rabbitmq-hom:15672/, e as credencias de acesso são as mesmas do ambiente de produção.
Arquitetura de Implementação de Microservices
Publicadores de Tarefas (Producers)
A solução Web e a solução Web Services terão o arquivo XML de configuração dos canais de comunicação, para publicarem a partir da interface IProducer, do projeto TCE.Microservices.
O arquivo de configuração dos canais de comunicação para o serviço AMQP do TCE-GO, corresponde a uma lista de instâncias da classe ConfiguracaoCallAMQP (namespace TCE.Microservices.InterfacesFabricas.Controle). Cada instância da fila contém a configuração de conexão com o servidor de mensagem AMQP (atributo ConfiguracaoAmqp), e as configurações do canal que será publicado a mensagem. Segue abaixo um exemplo do arquivo XML de configuração:
<?xml version="1.0" encoding="utf-8"?> <ArrayOfConfiguracaoCallAmqp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ConfiguracaoCallAmqp AutoDelete="false" Durable="false" Exclusive="false" QueueName="trabalho"> <TipoFilha>TRABALHO</TipoFilha> <ConfiguracaoAmqp> <Host>rabbitmq</Host> <Port>15672</Port> <UserName>admin</UserName> <Password>admin</Password> </ConfiguracaoAmqp> <Argumentos> <Key>stringConexao</Key> <Value xsi:type="xsd:string">teste</Value> </Argumentos> </ConfiguracaoCallAmqp> <ConfiguracaoCallAmqp AutoDelete="false" Durable="false" Exclusive="false" QueueName="log"> <TipoFilha>TRABALHO</TipoFilha> <ConfiguracaoAmqp> <Host>rabbitmq</Host> <Port>15672</Port> <UserName>guest</UserName> <Password>guest</Password> </ConfiguracaoAmqp> <Argumentos> <Key>stringConexao</Key> <Value xsi:type="xsd:string">teste</Value> </Argumentos> </ConfiguracaoCallAmqp> </ArrayOfConfiguracaoCallAmqp>
A interface IProducer possui os métodos Publish(task: TaskService), que publica a tarefa para ser executada pelos Microservices do TCE-GO; e o método LogarEvento, que permite gerar log o sistema de forma manual.
Para a publicação das tarefas não será necessário implementar uma interface específica de Producer para cada projeto, devendo ser utilizado apenas a interface IProducer mantida pelo projeto TCE.Microservices, a qual será instanciada pela fábrica genérica (FabricaGenerica). Sendo assim, para cada projeto que irá escalar alguma rotina de processamento de informação, deve instanciar o produtor, através da interface IProducer, informando no construtor a configuração do canal de comunicação com o serviço AMQP, uma instância da classe ConfiguracaoCallAmqp.
O padrão de comunicação com o serviço AMQP do TCE-GO, está especificado no documento Arquitetura de Microservices do TCE-GO, versionada pelo projeto TCE.Microservice.
Consumidores de Tarefas (Workers)
Os consumidores de tarefas publicadas pelo Producer, chamados Workers, são classes implementadas em cada projeto que deseja escalar algum processo de sua solução, para serem executadas pela solução Cloud Computing do TCE-GO. A implementação dos workers devem implementar uma interface específica que herda da interface padrão IWorker, e a classe de execução da tarefa que irá implementar a interface específica, deve também, herdar da classe padrão Worker. A interface IWorker e a classe Worker, são mantidas pelo projeto TCE.Microservices.
Assim como as soluções Web, Web Service e desktop que vão escalar suas rotinas de processamento, utilizando a publicação de tarefas para serem consumidas pelos Microservices, no agente instalado na máquina deve conter um arquivo de configuração CanaisDeTrabalho.xml, contendo a configurações dos canais de mensagem AMQP que o agente ficará escutando para obter as tarefas para serem executadas. O arquivo de configuração será configurado da seguinte forma:
<?xml version="1.0" encoding="utf-8"?> <ArrayOfConfiguracaoCallAmqp xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ConfiguracaoCallAmqp AutoDelete="false" Durable="false" Exclusive="false" QueueName="trabalho"> <TipoFilha>TRABALHO</TipoFilha> <ConfiguracaoAmqp> <Host>rabbitmq</Host> <Port>15672</Port> <UserName>admin</UserName> <Password>admin</Password> </ConfiguracaoAmqp> <Argumentos> <Key>stringConexao</Key> <Value xsi:type="xsd:string">teste</Value> </Argumentos> </ConfiguracaoCallAmqp> <ConfiguracaoCallAmqp AutoDelete="false" Durable="false" Exclusive="false" QueueName="log"> <TipoFilha>TRABALHO</TipoFilha> <ConfiguracaoAmqp> <Host>rabbitmq</Host> <Port>15672</Port> <UserName>guest</UserName> <Password>guest</Password> </ConfiguracaoAmqp> <Argumentos> <Key>stringConexao</Key> <Value xsi:type="xsd:string">teste</Value> </Argumentos> </ConfiguracaoCallAmqp> </ArrayOfConfiguracaoCallAmqp>
O agente de Microserives corresponde a um programa implementado pelo projeto TCE.Microservices, que deverá ser implantado e executado no sistema operacional Windows. Essa máquina será configurada para executar tarefas publicadas pelos Producer, quando na configuração de canal de comunicação com o servidor AMQP, tiver configurado escutar a fila da tarefa.
As máquinas físicas ou virtuais agente de Microservices, deverão tem configuração de acesso ao banco de dados, ter a configuração das DLL’s serviços dos projetos que o agente ficará escutando suas filas de trabalho, e ter a configuração do client da API do servidor RabbitMQ e ter configurado as variáveis de ambiente do TCE_CONFIG_PATH.
Implementação
Ajude a descrever: implementacao