Carregando
0x80Lição 9 de 13

Desacople o trabalho com filas de mensagens

Absorva picos e tire o trabalho lento do caminho da requisição.

20 min Questionário com 6 perguntas
Ao final desta lição, você saberá
  • 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 XP

O que uma fila pode absorver?

Entrevistadores costumam perguntar o que acontece quando os consumidores ficam para trás.

  1. Ligue o pico. A fila se recupera?
  2. Desligue-o e coloque a taxa de chegada acima da taxa de atendimento.
  3. Adicione backpressure (contrapressão). Qual é o trade-off?
00,30,50,81061218243036424854Tempo (ticks)Na espera
Mostrar os números em uma tabela
Tempo (ticks)Mensagens na espera
00
10
20
30
40
50
60
70
80
90
100
110
120
130
140
150
160
170
180
190
200
210
220
230
240
250
260
270
280
290
300
310
320
330
340
350
360
370
380
390
400
410
420
430
440
450
460
470
480
490
500
510
520
530
540
550
560
570
580
590
Maior backlog
0
Maior espera
0 tick
Rejeitadas
0

Os workers dão conta, então a fila fica vazia.

Experimente

Até 15 XP

No caminho da requisição ou numa fila?

O usuário precisa esperar por isso? Se não, é um candidato a ir para uma fila.

0 de 5 classificadosPontuação 0/0
  • “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…