ActiveMQ Easy Config

Joao M
ByJG
Published in
4 min readMar 12, 2019

O Apache ActiveMQ é um message broker utilizado para troca de mensagens entre aplicações. Ele é bem importante para intercomunicação de sistemas e também implementa vários protocolos para integração, como por exemplo o JMS (nativo Java), o AMQP (RabbitMQ) e o Stomp (que pode ser utilizado por aplicações PHP), dentre outros. Além disso a Amazon tem a sua versão “managed” chamada Amazon MQ o que facilita bastante na utilização do serviço.

Entretanto nos últimos dias foi preciso ampliar a capacidade do nosso broker e com isso a necessidade de se criar uma Network de Brokers. O processo consiste em rodar mais de um broker e configurar em cada um como ele vai se comunicar com os demais. O suporte para essa funcionalidade é nativo e é a forma recomendada de expansão, entretanto não existe uma fórmula mágica de uma configuração de redes que irá resolver o problema para todos os sistemas.

Sendo assim, era necessário testar as diferentes topologias e mesclar os conceitos entre elas de forma a validar a estrutura. O serviço utilizado era o Amazon MQ o que é relativamente simples de se configurar. Apesar de tudo correr como esperado havia duas coisas que incomodavam muito:

  1. Cada reboot ou nova instância de um Broker na Amazon leva em média 15 minutos para subir :(
  2. Quanto maior a quantidade brokers e conexões, mais linhas de código de configuração do tipo “copiar, colar e ajustar” eram feitas em cada broker. A possibilidade de se criar um broker com a configuração errada ou de se fazer um pequeno ajuste era muito alta. Isso significava em alterar a configuração e mais 15 minutos de espera.

Isso fazia com que o processo de teste seja demorado além de diminuir a quantidade de topologias que poderíamos testar.

Nesse momento eu tive a ideia de criar um processo para garantir a criação da configuração sem erros, manter documentada a topologia e ainda poder testar localmente essa configuração antes de aplicar no meu ambiente produtivo. Nasce então o ActiveMQ Easy Config.

O ActiveMQ Easy Config é um script em python que interpreta um arquivo Yaml e gera um arquivo xml com as configurações necessárias para cada broker. Além disso, o script gera o Dockerfile necessário para que os brokers possam rodar localmente. Assim, eu consigo testar uma topologia muito rápido e em menos de 1 minuto ela está ativa e pronta para operar, e sem erros de configuração.

Como funciona?

Inicialmente temos que baixar o projeto que se encontra em :

git clone https://github.com/byjg/activemq-easy-config.git

Após isso, podemos definir a topologia a ser utilizada. Existem várias topologias bem conhecidas como Hub and Spoke, Concentrador, Mesh, etc. Para ilustrar aqui irei utilizar uma configuração de Grafo Completo na qual todos os brokers falam com todos os brokers e a menor distância entre qualquer nó é de apenas 1 HOP.

O arquivo de configuração para essa topologia é o seguinte:

brokers:
broker1: "static:(tcp://broker1:61616)"
broker2: "static:(tcp://broker2:61616)"
broker3: "static:(tcp://broker3:61616)"
broker4: "static:(tcp://broker4:61616)"
broker5: "static:(tcp://broker5:61616)"
networks:
common_configuration:
conduit_subscriptions: "true"
consumer_ttl: "1"
duplex: "false"
message_ttl: "-1"
user_name: "admin"
network_connector:
broker1:
to:
- broker2
- broker3
- broker4
- broker5
broker2:
to:
- broker1
- broker3
- broker4
- broker5
broker3:
to:
- broker1
- broker2
- broker4
- broker5
broker4:
to:
- broker1
- broker2
- broker3
- broker5
broker5:
to:
- broker1
- broker2
- broker3
- broker4

Observe que o Yaml é dividido em duas partes:

brokers

Define os nomes e os endereços de conexão dos brokers

brokers:
broker1: "static:(tcp://broker1:61616)"

Essa conexão será utilizada na topologia. Como eu quero testar localmente eu vou definir a conexão do broker como sendo o nome dele. Se eu quiser mudar o string de conexão eu só preciso modificar nesse tópico, sem mexer na minha topologia.

networks

Define a configuração da rede de brokers.

Em networks -> common_configurations temos as configurações padrões a todos os brokers e em networks -> network_conector definimos as interligações entre os brokers. A configuração é:

NOME_DO_BROKER:
to:
- NOME_DOS_BROKERS_CONECTADOS
- NOME_DOS_BROKERS_CONECTADOS
- NOME_DOS_BROKERS_CONECTADOS
config:
- CONFIGURAÇÃO ESPECÍFICA PARA ESSE BROKER

Para rodar o sistema e gerar os arquivos de configuração basta fazer:

python aec.py \
--activemq templates/activemq.xml \
--config templates/full-graph-config.yaml \
--save-to $HOME/activemq-test

Isso vai gerar os arquivos de configuração para cada um dos brokers de acordo com a definição de rede acima, e também vai gerar dois arquivos shell script: build.sh que irá construir as imagens docker, e o arquivo run.sh que irá rodar localmente os brokers de forma que você possa testar a sua configuração localmente.

--

--

Joao M
ByJG
Editor for

Engenheiro e arquiteto de Software desde 1987 mexendo com computadores :)