Introdução ao RabbitMQ

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.