Desacople o trabalho com filas de mensagens
Absorva picos e tire o trabalho lento do caminho da requisição.
- Explicar o que uma fila acrescenta entre produtores e consumidores.
- Comparar entregas at-most-once, at-least-once e exactly-once.
- Tornar os consumidores idempotentes para que as novas tentativas sejam seguras.
Uma fila de mensagens (SQS, RabbitMQ) ou um log (Kafka) fica entre os serviços que produzem trabalho e os que o consomem. O produtor retorna assim que a mensagem é armazenada, então o trabalho lento - enviar e-mails, transcodificar vídeos, atualizar feeds - acontece de forma assíncrona. Filas também nivelam a carga: um pico se acumula na fila em vez de sobrecarregar os consumidores, que a esvaziam no seu próprio ritmo.
Garantias de entrega
- At-most-once (no máximo uma vez): uma mensagem pode se perder, mas nunca é entregue de novo.
- At-least-once (pelo menos uma vez): uma mensagem é reentregue até ser confirmada, então pode chegar mais de uma vez. É o padrão mais comum.
- Exactly-once (exatamente uma vez): muito difícil de ponta a ponta. Na prática, você consegue um efetivamente uma vez combinando entrega at-least-once com consumidores idempotentes.
Uma operação é idempotente se aplicá-la duas vezes tem o mesmo efeito que aplicá-la uma vez. Os consumidores conseguem isso registrando os IDs das mensagens já processadas (ou usando uma chave de idempotência) e ignorando as duplicatas.
Um exemplo: as entregas chegam como pay-1 de US$ 50, pay-2 de US$ 20 e depois pay-1 de novo. Um consumidor que registra os IDs processados ignora a repetição, então o saldo fica em US$ 70, e não US$ 120.
Outros padrões de fila aparecem com frequência. Filas de trabalho entregam cada mensagem a um único consumidor; o pub/sub entrega cada mensagem a todos os assinantes. O Kafka só garante a ordem dentro de uma partição, então você escolhe uma chave de partição (como o ID do usuário) para eventos que precisam continuar em ordem. Uma dead-letter queue (DLQ) junta as mensagens que continuam falhando, para que uma mensagem ruim não trave as outras. Fique de olho no consumer lag (atraso dos consumidores): se os produtores forem mais rápidos que os consumidores por muito tempo, o acúmulo cresce sem limite.
Prática: sobrecarregue uma fila
Experimente
Até 15 XPO que uma fila pode absorver?
Entrevistadores costumam perguntar o que acontece quando os consumidores ficam para trás.
- Ligue o pico. A fila se recupera?
- Desligue-o e coloque a taxa de chegada acima da taxa de atendimento.
- Adicione backpressure (contrapressão). Qual é o trade-off?
Mostrar os números em uma tabela
| Tempo (ticks) | Mensagens na espera |
|---|---|
| 0 | 0 |
| 1 | 0 |
| 2 | 0 |
| 3 | 0 |
| 4 | 0 |
| 5 | 0 |
| 6 | 0 |
| 7 | 0 |
| 8 | 0 |
| 9 | 0 |
| 10 | 0 |
| 11 | 0 |
| 12 | 0 |
| 13 | 0 |
| 14 | 0 |
| 15 | 0 |
| 16 | 0 |
| 17 | 0 |
| 18 | 0 |
| 19 | 0 |
| 20 | 0 |
| 21 | 0 |
| 22 | 0 |
| 23 | 0 |
| 24 | 0 |
| 25 | 0 |
| 26 | 0 |
| 27 | 0 |
| 28 | 0 |
| 29 | 0 |
| 30 | 0 |
| 31 | 0 |
| 32 | 0 |
| 33 | 0 |
| 34 | 0 |
| 35 | 0 |
| 36 | 0 |
| 37 | 0 |
| 38 | 0 |
| 39 | 0 |
| 40 | 0 |
| 41 | 0 |
| 42 | 0 |
| 43 | 0 |
| 44 | 0 |
| 45 | 0 |
| 46 | 0 |
| 47 | 0 |
| 48 | 0 |
| 49 | 0 |
| 50 | 0 |
| 51 | 0 |
| 52 | 0 |
| 53 | 0 |
| 54 | 0 |
| 55 | 0 |
| 56 | 0 |
| 57 | 0 |
| 58 | 0 |
| 59 | 0 |
- Maior backlog
- 0
- Maior espera
- 0 tick
- Rejeitadas
- 0
Os workers dão conta, então a fila fica vazia.
Experimente
Até 15 XPNo caminho da requisição ou numa fila?
O usuário precisa esperar por isso? Se não, é um candidato a ir para uma fila.
“Conferir a senha no login.”
“Enviar um e-mail de boas-vindas.”
“Transcodificar um vídeo enviado.”
“Conferir o estoque antes de confirmar um pedido.”
“Atualizar os feeds dos seguidores depois de um post.”
Principais conclusões
Filas desacoplam serviços, nivelam picos e tiram o trabalho lento do caminho da requisição.
Suponha entrega at-least-once e projete consumidores idempotentes.
Planeje a ordenação (chaves de partição), as mensagens envenenadas (DLQs) e o atraso.
Quiz da aula
6 perguntas · aprovação com 5 acertos · até 50 XP
Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.
Dúvidas sobre esta lição
Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.
Carregando publicações…