Workshop: Deploy descomplicado de aplicações em VPS 🚀

Gerenciando filas simples em PHP com RabbitMq

Publicado em 17/01/2018

Atualizado em 03/06/2024

As palavras do momento são escalabilidade e microsserviços! Todo mundo quer ser cool e estar por dentro das inovações. Pensando nisso, venho falar um pouco sobre os message brokers (envio de mensagens entre sistemas), uma das técnicas mais utilizadas para comunicação assíncrona, utilizando o RabbitMq.

É legal também entender quais problemas essa técnica resolve e quais ele não resolve! Para saber justamente o que é prego e o que é parafuso.

O que é uma fila?

Uma fila é composta por várias mensagens que serão consumidas por alguém.

Como podemos ver em vermelho na figura 1 abaixo.

1
Fig 1. Fila

Como podemos observar ainda na figura 1, nós temos o “P” representando o produtor de mensagens e os consumidores “C” (ou Workers), consumindo as mensagens dessa fila. Até aí… tudo fácil.

O que é o RabbitMq?

É um serviço de gerenciamento de filas, com ele você pode criar usuários, filas e uma gama de outras funcionalidades. Vou demonstrar aqui de forma bem simples. Para um primeiro contato apenas.

Subindo um servidor Rabbit (utilizando Docker):

$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 -p 5672:5672 rabbitmq:management-alpine

Pronto, ja podemos acessar a aplicação (user: guest/ pass: guest):

2
Fig 2. Tela Inicial RabbitMq

E já podemos ver o nosso servidor rodando!

3

Criando o primeiro Producer (Produtor de mensagens)

Vamos criar um simples script php para interagir com o nosso Rabbit, primeiro crie o arquivo composer.json com o seguinte conteúdo:

{
    "require": {
        "php-amqplib/php-amqplib": ">=2.6.1"
    }
}

Instale as dependências:

composer.phar install

Vamos criar o arquivo send.php com o seguinte conteúdo:

<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

/**
 * Inicia a conexão
 */
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

/**
 * Declara qual a fila que será usada
 */
$channel->queue_declare('hello', false, false, false, false);

/**
 * Cria a nova mensagem
 */
$msg = new AMQPMessage('Ola mundo!');

/**
 * Envia para a fila
 */
$channel->basic_publish($msg, '', 'hello');

/**
 * Encerra conexão
 */
$channel->close();
$connection->close();

Logo após criarmos o arquivo receive.php

<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;


/**
 * Inicia a conexão
 */
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

/**
 * Declara qual a fila que será usada
 */
$channel->queue_declare('hello', false, false, false, false);

echo ' [*] Waiting for messages. To exit press CTRL+C', "\n";

/**
 * Função que vai receber e tratar efetivamente a mensagem
 */
$callback = function($msg) {
  echo " [x] Received ", $msg->body, "\n";
};

/**
 * Adiciona esse "callback" para a fila 
 */
$channel->basic_consume('hello', '', false, true, false, false, $callback);

/**
 * Mantem a função escutando a fila por tempo indeterminado, até que seja encerrada
 */
while(count($channel->callbacks)) {
    $channel->wait();
}

$channel->close();
$connection->close();

Rodando esses dois arquivos agora, com o nosso servidor up, podemos ver a seguinte mensagem (clique na imagem para expandir):

imagem 5


Podemos adicionar quantos “workers” forem necessários! Veja o exemplo abaixo (clique na imagem para expandir):

php

Incrível não?

Essa tecnologia nos permite inúmeras possibilidades, tendo apenas 1 servidor provendo o serviço do Rabbit. Isso significa que várias aplicações podem utilizar usuários diferentes e criar filas e workers conforme a sua necessidade!

Quais os casos em que eu posso utilizar o RabbitMQ?

  1. Processos independentes: quando eu preciso realizar uma tarefa em paralelo mas não é necessário esperar ela terminar para continuar o meu fluxo.
  2. Envio de email: Caso comum de quando eu não preciso aguardar uma resposta do meu SMTP. O worker pode se encarregar disso.
  3. Registro de logs: Com aplicações distribuídas em N servidores, não podemos e nem devemos guardar os logs localmente no servidor. Nesse cenário a aplicação A1 envia os logs para uma fila no servidor B e o worker no servidor C irá consumir a fila e armazenará corretamente esse log. Mesmo escalando minha aplicação para A1 A2 A3, todos os logs serão armazenados no local correto.

Quando não usar o RabbitMQ?

  1. Processos baseados em tempo. Ex: Essa rotina deve executar sempre às 14h. Para esse problema existem outras formas de resolução.
  2. Grande volumes de dados: Quando eu falo em grande volume, é GRANDE volume… um servidor mínimo do rabbit consegue dar conta de pelo menos 20.000 msg/s. Isso vai depender de quão pesado é a atividade do worker. Mas mesmo para aplicações que geram bastante logs, essa taxa de mensagens é suficiente. Você deve pensar em outra solução (ex: Kafka) se a sua necessidade excede as 300.000 msg/s.

Conclusão

O serviço de mensagens pode ser um grande aliado na construção de sistemas simples e independentes, separando responsabilidades e obrigando a criação de papéis distintos.

O ponto forte do RabbitMQ é a simplicidade de utilização, junto com uma interface de gerenciamento. Por outro lado é um pouco mais custoso escalar a estrutura.

Eu já utilizo o Rabbit em produção há 3 anos em diversos projetos e não tive problemas. Aconselho todos a darem uma olhada e brincarem um pouco.

Todos os arquivos estão mencionados no texto. Divirtam-se!

Para mais aprendizados: vejam a documentação oficial no site do RabbitMQ!

Curtiu do material? Acompanhe outros posts meus no blog da KingHost.

O que você achou deste conteúdo?

O que você achou deste conteúdo?

Daniel
Daniel Archer
Focado em performance e boas práticas de programação, certificado ZEND ZCPE 5.5.
Daniel
Daniel Archer
Focado em performance e boas práticas de programação, certificado ZEND ZCPE 5.5.

Compartilhe esse conteúdo com alguém que possa gostar também

Receba todo mês conteúdos
incríveis como esses para
seguir evoluindo

Conteúdos relacionados

Saber como instalar o OpenClaw vai além dos requisitos técnicos. Antes de iniciar a configuração, é importante entender os objetivos da operação, os casos de uso e como a ferramenta pode contribuir para acelerar a implementação de agentes de IA. O OpenClaw centraliza a criação e operação de agentes de IA em um único ambiente....
Entenda como criar um agente de IA, definir arquitetura, escolher tecnologia adequada e preparar infraestrutura para execução em produção, considerando integrações, observabilidade, custos operacionais e escalabilidade. Criar um agente de IA vai além de escolher um modelo de linguagem ou escrever prompts. Em produção, fatores como integração com sistemas, gerenciamento de contexto, observabilidade, custos computacionais...
Mais do que entender o que é GEO, as marcas precisam desenvolver maturidade operacional para atuar nesse novo cenário: produção orientada à intenção, consistência temática e conteúdos estruturados para interpretação por modelos de IA, sem comprometer a experiência humana. A forma como os usuários acessam informação está passando por uma mudança estrutural. Interfaces baseadas em...
A crescente adoção de inteligência artificial e automação no mundo corporativo tem impulsionado o surgimento de novas ferramentas voltadas à coleta, análise e ativação de dados, exatamente o motivo para você saber o que é OpenClaw. Entre essas inovações, o OpenClaw chama atenção por ir além do modelo tradicional dos chatbots e se aproximar do...

Mensagens para você