Ao usar o RabbitMQ, alguns cenários de negócio exigem garantia de consumo sequencial. Por exemplo, em um cenário onde três mensagens são geradas para realizar operações de adição, modificação e exclusão de dados, se a ordem de consumo não for garantida, a sequência de execução pode se tornar exclusão, modificação, adição, resultando em desordem.

Conforme mostrado abaixo:

A questão da sequência de mensagens no RabbitMQ precisa ser considerada em três aspectos: a ordem de envio das mensagens, a ordem das mensagens na fila e a ordem de consumo das mensagens.

Ordem de envio das mensagens

Para a maioria dos negócios, a ordem de transmissão de mensagens no lado do remetente não é estritamente necessária. Não importa quem envia a mensagem primeiro. Se um negócio exigir que as mensagens sejam enviadas em ordem, significa que apenas uma mensagem pode ser enviada de cada vez, com bloqueio global, e as mensagens não podem ser enviadas simultaneamente.

Ordem das mensagens na fila

No RabbitMQ, as mensagens serão armazenadas em uma fila. Dentro da mesma fila, as mensagens são ordenadas com base no princípio do primeiro a entrar, primeiro a sair, o que é garantido pelo RabbitMQ e geralmente não precisa ser uma preocupação para os desenvolvedores.

Nota: A ordem das mensagens em filas diferentes não é garantida. Por exemplo, ao entrar em uma estação de metrô e escolher uma das três filas, a ordem de entrada na estação não pode ser garantida entre diferentes filas.

Ordem de consumo das mensagens

Ao discutir como garantir a sequência de mensagens, geralmente estamos nos referindo à ordem em que os consumidores consomem as mensagens. Em cenários onde múltiplos consumidores consomem mensagens da mesma fila de mensagens, geralmente não é possível garantir a sequência de mensagens. Conforme indicado no diagrama inicial, embora as mensagens na fila de mensagens estejam ordenadas, múltiplos consumidores consumindo mensagens em paralelo, a velocidade com que as mensagens são recuperadas, a velocidade de execução da lógica de negócios e possíveis exceções de execução podem levar à sequência de mensagens inconsistente.

Por exemplo: Mensagens A, B e C entram na fila em sequência. O consumidor A1 recebe a mensagem A e o consumidor B1 recebe a mensagem B. No entanto, se o consumidor B1 executar mais rapidamente, pode concluir antes do consumidor A1, ou se o consumidor A1 encontrar um erro, ambos os cenários podem levar a uma sequência de mensagens inconsistente.

A solução típica para o problema de consumo em sequência é ter apenas um consumidor na fila Dessa forma, as mensagens podem ser processadas uma por uma em ordem. A desvantagem é que a capacidade de concorrência diminui e o consumo de mensagens em paralelo não é possível. Isso é uma compensação.

Nota: Se o negócio exigir consumo sequencial e aumento de concorrência, uma abordagem comum é habilitar múltiplas filas. O negócio pode distribuir mensagens para diferentes filas com base em regras, aumentando assim o nível de concorrência. Por exemplo, em um cenário de pedidos de e-commerce, é necessário apenas garantir a sequência das mensagens de pedidos para o mesmo usuário. As mensagens pertencentes a diferentes usuários podem ser direcionadas para filas diferentes.