Contextualizando
Como funciona a Fila?
As filas de mensagens fornecem um mecanismo de comunicação assíncrona no qual o publicador e os inscritos de uma mensagem não se comunicam, nem precisam se comunicar com a fila de mensagens ao mesmo tempo. Quando um remetente coloca uma mensagem em uma fila, ela é armazenada até que o destinatário a receba.
No Magento 2 (Adobe Commerce), o MQF (Message Queue Framework) é um sistema totalmente funcional que permite que um módulo publique mensagens em filas. Também cria consumidores para recebê-los de forma assíncrona.O MQF usa principalmente o RabbitMQ como agente de mensagens, que fornece uma plataforma escalável para enviar e receber mensagens. Também inclui um mecanismo para armazenar mensagens não entregues.
Um sistema básico de fila de mensagens também pode ser configurado sem usar o RabbitMQ. Neste sistema, um adaptador MySQL armazena mensagens no banco de dados. Existem três tabelas no banco de dados (queue, queue_message e queue_message_status) que gerenciam a cron jobs para as filas de mensagens.
RabbitMQ
O RabbitMQ é um serviço de mensageria de código aberto que oferece um sistema de mensagens confiável, altamente disponível, escalável e portátil. O sistema de fila de mensagens deve ser estabelecido antes de instalar o Magento.
As filas de mensagens fornecem um mecanismo de comunicação assíncrona no qual o remetente e o destinatário de uma mensagem não se comunicam. Eles também não precisam se comunicar com a fila de mensagens ao mesmo tempo. Quando um remetente coloca uma mensagem em uma fila, ela é armazenada até que o destinatário as receba. Embora as mensagens fluam pelo RabbitMQ e seus aplicativos, elas só podem ser armazenadas dentro de uma fila. Uma fila é limitada apenas pelos limites de memória e disco do host (seria um grande buffer de mensagem). Muitos produtores podem enviar mensagens que vão para uma fila e muitos consumidores podem tentar receber dados de uma fila.
Código para criar uma fila
communication.xml
O arquivo communication.xml define aspectos do sistema da fila de mensagens que todos os tipos de comunicação possuem em comum, seguindo a estruturas de pastas \{Vendor}\{Module}\etc\communication.xml. Por hora, oferece suporte a conexões AMQP e de banco de dados.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Communication/etc/communication.xsd">
<topic name="{topic.name}" request="{Vendor}\{Module}\Api\Data\{ServiceName}"/>
<topic name="{topic.name}" request="{request_type}" response="{response_type}">
<handler name="{handlerName}" type="{Vendor}\{Module}\Model\{ServiceName}" method="{methodName}"/>
</topic>
<topic name="{topic.name}" schema="{Vendor}\{Module}\Api\{ServiceName}::{methodName}">
<handler name="{handlerName}" type="{Vendor}\{Module}\Model\{ServiceName}" method="{methodName}"/>
</topic>
</config>
Atributos do nó ‘topic’
A configuração de tópicos é flexível, pois é possível alternar a camada de transporte para tópicos no momento da implantação. Esses valores podem ser sobrescritos no arquivo env.php.
O atributo name é obrigatório. A definição do tópico deve incluir uma request ou um schema. É possível utilizar schema se desejar implementar uma interface de serviço personalizada. Caso contrário, especifique a request. Ao especificar o request, o response deve ser especificado, se o tópico for síncrono.
| Atributos | Descrição |
|---|---|
| name | Uma string que identifica exclusivamente o tópico. Um nome de tópico deve ser uma série de strings separadas por pontos. A string mais à esquerda deve ser a mais geral, e cada string posterior deve restringir o escopo. |
| request | Especifica o tipo de dados do tópico. |
| response | Especifica o formato da resposta. Esse parâmetro é necessário se estiver definindo um tópico síncrono, caso o tópico seja assíncrono basta omita este parâmetro. |
| schema | A interface que descreve a estrutura da mensagem (o formato deve ser: \{Vendor}\{Module}\Api\{ServiceName}::{methodName}). |
Atributos do nó ‘handler’
O nó <handler> especifica a classe onde existe a lógica para manipulação de mensagens e o método que a executa.
| Atributos | Descrição |
|---|---|
| name | String que define o nome do nó <handler>. |
| type | A classe ou interface que define o <handler>. |
| method | O nome do método que será executado. |
| disabled | Determina se o <handler> está desabilitado. O valor padrão é false. |
queue_consumer.xml
Este arquivo define aspectos do sistema de fila de mensagens que todos os tipos de comunicação têm em comum e deve estar localizado na pasta \{Vendor}\{Module}\etc\queue_consumer.xml, e pode possuir mais de um consumidor.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/consumer.xsd">
<consumer name="{ConsumerName}" queue="{queue_name}" handler="{Vendor}\{Module}\Model\{HandlerName}::{methodName}" connection="{amqp/db}" maxMessages="{integer}" maxIdleTime="{integer}" sleep="{integer}" onlySpawnWhenMessageAvailable="{0/1}"/>
<consumer name="{ConsumerName}" queue="{queue_name}" consumerInstance="{Vendor}\{Module}\Model\{ConsumerName}" connection="{amqp/db}" maxMessages="{integer}" maxIdleTime="{integer}" sleep="{integer}" onlySpawnWhenMessageAvailable="{0/1}"/>
</config>
Atributos do nó ‘consumer’
Os atributos maxIdleTime e sleep serão tratados apenas por consumidores que foram enviados com o parâmetro maxMessages definido. O atributo onlySpawnWhenMessageAvailable é verificado e validado apenas pela classe \Magento\MessageQueue\Model\Cron\ConsumersRunner que executa processos de consumidor com cron.
| Atributos | Descrição |
|---|---|
| name | Nome do nó <consumer>. |
| queue | Define o nome da fila para a qual será enviada a mensagem. |
| handler | Especifica a classe ou interface e o método que processa a mensagem. O valor deve ser especificado no formato \{Vendor}\{Module}\{Directory}\{HandlerName}:{methodName}. |
| consumerInstance | O nome da classe que consumirá a mensagem |
| connection |
amqp: o nome da conexão deve corresponder ao atributo de conexão no arquivo queue_topology.xml. db: qualquer outro cenário. |
| maxMessages | Especifica o número máximo de mensagens a serem consumidas. |
| maxIdleTime | Define o tempo máximo de espera em segundos para uma nova mensagem da fila. Se nenhuma mensagem for tratada nesse período de tempo, o consumidor enviará. O valor padrão é null. |
| sleep | Especifica o tempo em segundos antes de verificar se uma nova mensagem está disponível na fila. O valor padrão é null, o que equivale a 1 segundo. |
| onlySpawnWhenMessageAvailable | Identifica se um consumidor deve ser gerado somente se houver mensagem disponível na fila relacionada. O valor padrão é null. |
Consumidor Handler
Um handler é uma classe com um método que consome uma mensagem. E pode ser definido no nó <topic>, como um nó filho <handler> no arquivo communication.xml, ou como atributo handler no nó <consumer> no arquivo queue_consumer.xml.
Se o consumidor em queue_consumer.xml não tiver um consumerInstance definido, o sistema usará o consumidor padrão \Magento\Framework\MessageQueue\Consumer. Neste caso, caso o nó <consumer> conter o atributo handler, ele será usado, e o nó <handler> no arquivo communication.xml será ignorado.
Se o consumidor no arquivo queue_consumer.xml tiver um consumerInstance definido, então a implementação do consumidor será definido como o atributo handler será utilizado.
queue_topology.xml
O arquivo queue_topology.xml define as regras de roteamento de mensagens e declara filas e trocas, seguindo a estruturas de pastas \{Vendor}\{Module}\etc\queue_topology.xml.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/topology.xsd">
<exchange name="{exchange.name}" type="topic" connection="{amqp/db}" durable="{true/false}" autoDelete="{true/false}">
<binding id="{queue_consumer_name}" topic="{communication.topic.name}" destinationType="queue" destination="{queue_consumer_queue}">
<arguments>
<argument name="{argument_name}" xsi:type="string">{value}</argument>
</arguments>
</binding>
</exchange>
</config>
Atributos do nó ‘exchange’
| Atributos | Descrição |
|---|---|
| name | Define o identificador único. |
| type | Especifica o tipo de troca. Deve ser topic. |
| connection | Para conexões AMQP, o nome da conexão é recomendável que se utilize amqp. Para conexões MySQL, o nome da conexão deve ser db. |
| durable | Indica se a exchange é persistente. As exchanges não duráveis são eliminadas quando o servidor é reiniciado. O padrão é true. |
| autoDelete | Indica se a exchange é excluída quando todas as filas terminarem de usá-la. O padrão é false. |
| internal | Se definido como verdadeiro, a exchange não pode ser usada diretamente pelos publishers, mas somente quando vinculada a outras exchanges. O padrão é false. |
Atributos do nó ‘binding’
O nó <binding> é um nó filho do nó <exchange>.
| Atributos | Descrição |
|---|---|
| id | Define o identificador único (recomendável colocar o mesmo valor que está atribuído ao atributo name do arquivo queue_consumer.xml) . |
| topic | O nome de um tópico (colocar o mesmo valor que está atribuído ao atributo name do arquivo communication.xml). |
| destinationType | Deve ser queue. |
| destination | Identifica o nome de uma fila (recomendável colocar o mesmo valor que está atribuído ao atributo queue do arquivo queue_consumer.xml). |
| autoDeletedisabled | Determina se o <binding> está desabilitado. O valor padrão é false. |
queue_publisher.xml
O arquivo queue_publisher.xml define qual conexão e troca usar para publicar mensagens para um tópico específico, seguindo a estruturas de pastas \{Vendor}\{Module}\etc\queue_publisher.xml.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
<publisher topic="{communication.topic.name}">
<connection name="{amqp/db}" exchange="{exchange.name}" disabled="{true/false}"/>
</publisher>
</config>
Atributos do nó ‘publisher’
| Atributos | Descrição |
|---|---|
| topic (obrigatório) | O nome de um tópico (colocar o mesmo valor que está atribuído ao atributo name do arquivo communication.xml). |
| disabled | Determina se esta fila está desabilitada. O valor padrão é false. |
Atributos do nó ‘connection’
O nó <connection> é um nó filho do elemento <publisher>. Não deve haver mais de uma <connection> habilitada para um <publisher>. Caso o nó <connection> esteja omitido o elemento de conexão, a conexão padrão amqp do magento será usada no atributo exchange.
| Atributos | Descrição |
|---|---|
| name (obrigatório) |
amqp: o nome da conexão deve corresponder ao atributo de conexão no arquivo queue_topology.xml. db: qualquer outro cenário. |
| exchange | O nome da exchange na qual vai publicar a mensagem (colocar o mesmo valor que está atribuído ao atributo name do nó <exchange> do arquivo queue_topology.xml). O nome da exchange do sistema padrão é magento. |
| disabled | Determina se esta fila está desabilitada. O valor padrão é false. |
Finalizando
Valores entre chaves (
{test}) devem ser alterados na implementação do código.
Habilitando as alterações
Apague os arquivos que são gerados na compilação do Magento e execute o comando PHP para gerar a configuração das injeções de dependência e todas as classes ausentes que precisam ser geradas (proxys, interceptors, etc) e para limpar todos os caches de armazenamento em cache do processos.
rm -rf var/generation/
rm -rf generated/
php bin/magento setup:di:compile
php bin/magento cache:clean
php bin/magento flush
Diretórios e Arquivos
Segue a a lista de diretórios e arquivos que devem ser criados.
- app/
- code/
- {Vendor}/
- {Module}/
- etc/
- communication.xml
- queue_consumer.xml
- queue_topology.xml
- queue_publisher.xml
- module.xml
- registration.php
- composer.json
Top comments (0)