Introdução ao RabbitMQ
1. Visão geral
A dissociação de componentes de software é uma das partes mais importantes do design de software. Uma maneira de conseguir isso é usar sistemas de mensagens, que fornecem uma maneira assíncrona de comunicação entre componentes (serviços). Neste artigo, abordaremos um desses sistemas: RabbitMQ.
RabbitMQ é um agente de mensagens que implementa o Advanced Message Queuing Protocol (AMQP). Ele fornece bibliotecas cliente para as principais linguagens de programação.
Além de usar para desacoplar componentes de software, o RabbitMQ pode ser usado para:
-
Executando operações em segundo plano
-
Executando operação assíncrona
2. Modelo de Mensagens
Primeiro, vamos dar uma olhada rápida e de alto nível em como as mensagens funcionam.
Simplificando, existem dois tipos de aplicativos que interagem com um sistema de mensagens: produtores e consumidores. Produtores são aqueles que enviam (publicam) mensagens para um corretor e consumidores que recebem mensagens do corretor. Normalmente, esses programas (componentes de software) estão sendo executados em máquinas diferentes e o RabbitMQ atua como um middleware de comunicação entre eles.
Neste artigo, discutiremos um exemplo simples com dois serviços que se comunicarão usando o RabbitMQ. Um dos serviços publicará mensagens no RabbitMQ e o outro consumirá.
3. Configuração
Para começar, vamos executar o RabbitMQ usando o guia de configuração oficialhere.
Naturalmente, usaremos o cliente Java para interagir com o servidor RabbitMQ; oMaven dependency para este cliente é:
com.rabbitmq
amqp-client
4.0.0
Após executar o broker do RabbitMQ usando o guia oficial, precisamos conectar-se a ele usando o cliente java:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
Usamos oConnectionFactory para configurar a conexão com o servidor, ele cuida do protocolo (AMQP) e da autenticação também. Aqui nos conectamos ao servidor emlocalhost, podemos modificar o nome do host usando a funçãosetHost.
Podemos usarsetPort para definir a porta se a porta padrão não for usada pelo Servidor RabbitMQ; a porta padrão para RabbitMQ é15672:
factory.setPort(15678);
Podemos definir o nome de usuário e a senha:
factory.setUsername("user1");
factory.setPassword("MyPassword");
Além disso, usaremos essa conexão para publicar e consumir mensagens.
4. Produtor
Consider a simple scenario em que um aplicativo da web permite que os usuários adicionem novos produtos a um site. Sempre que um novo produto é adicionado, precisamos enviar um email aos clientes.
Primeiro, vamos definir uma fila:
channel.queueDeclare("products_queue", false, false, false, null);
Sempre que os usuários adicionarem um novo produto, publicaremos uma mensagem em uma fila:
String message = "product details";
channel.basicPublish("", "products_queue", null, message.getBytes());
Por fim, fechamos o canal e a conexão:
channel.close();
connection.close();
Essa mensagem será consumida por outro serviço, responsável pelo envio de e-mails aos clientes.
5. Consumidor
Vamos ver o que podemos implementar no lado do consumidor; vamos declarar a mesma fila:
channel.queueDeclare("products_queue", false, false, false, null);
Veja como definimos o consumidor que processará as mensagens da fila de forma assíncrona:
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(
String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body) throws IOException {
String message = new String(body, "UTF-8");
// process the message
}
};
channel.basicConsume("products_queue", true, consumer);
6. Conclusão
Este artigo simples abordou os conceitos básicos do RabbitMQ e discutiu um exemplo simples de como usá-lo.
A implementação completa deste tutorial pode ser encontrada emthe GitHub project.