🧩 Exercícios: Mensageria Assíncrona com RabbitMQ e Kafka
Spec Backend Com Golang E Gin • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 14.1 — Publicação de Mensagens no RabbitMQ com amqp091-go
Contexto: Publicação de Mensagens no RabbitMQ com amqp091-go no contexto de Mensageria Assíncrona com RabbitMQ e Kafka.
Requisitos de Execução:
- Conectar ao broker RabbitMQ e publicar evento de
PedidoCriadoEventserializado em JSON na filapedidos_queue.
Resultado Esperado
Mensagem publicada na fila 'pedidos_queue' com sucesso.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_1_SeuNome - Envie na tarefa:
Atividade Cap 14 - Mensageria Assíncrona com RabbitMQ e Kafka
🔑 Gabarito de Código & Solução Comentada
// messaging/rabbitmq_pub.go
package messaging
import (
"context"
amqp "github.com/rabbitmq/amqp091-go"
)
func PublicarMensagem(ch *amqp.Channel, fila string, body []byte) error {
_, err := ch.QueueDeclare(fila, true, false, false, false, nil)
if err != nil { return err }
return ch.PublishWithContext(context.Background(), "", fila, false, false, amqp.Publishing{
ContentType: "application/json",
DeliveryMode: amqp.Persistent,
Body: body,
})
}
🔍 Nível 2: Prática
Problema 14.2 — Consumidor Contínuo com Ack e Rejeição (Nack)
Contexto: Consumidor Contínuo com Ack e Rejeição (Nack) no contexto de Mensageria Assíncrona com RabbitMQ e Kafka.
Requisitos de Execução:
- Implementar consumidor em goroutine que processe mensagens da fila com confirmação manual
msg.Ack(false).
Resultado Esperado
Consumidor processando mensagens da fila em background.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_2_SeuNome - Envie na tarefa:
Atividade Cap 14 - Mensageria Assíncrona com RabbitMQ e Kafka
🔑 Gabarito de Código & Solução Comentada
// messaging/consumer.go
package messaging
import amqp "github.com/rabbitmq/amqp091-go"
func ConsumirMensagens(msgs <-chan amqp.Delivery) {
for d := range msgs {
// Processa mensagem
d.Ack(false)
}
}
⚡ Nível 3: Integração
Problema 14.3 — Padrão Transacional Outbox com Processador em Go
Contexto: Padrão Transacional Outbox com Processador em Go no contexto de Mensageria Assíncrona com RabbitMQ e Kafka.
Requisitos de Execução:
- Gravar evento na tabela
outbox_eventsna mesma transação de banco e publicador em goroutine consumindo a tabela.
Resultado Esperado
Garantia de consistência eventual: Dados gravados no banco e mensageria garantida sem dual-write.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_3_SeuNome - Envie na tarefa:
Atividade Cap 14 - Mensageria Assíncrona com RabbitMQ e Kafka
🔑 Gabarito de Código & Solução Comentada
// outbox_pattern.go
package main
import "gorm.io/gorm"
type OutboxEvent struct {
ID uint
Topic string
Payload string
Processado bool
}
func GravarOutbox(tx *gorm.DB, topic, payload string) error {
return tx.Create(&OutboxEvent{Topic: topic, Payload: payload, Processado: false}).Error
}
🏆 Nível 4: Desafio Corporativo
Problema 14.4 — Dead Letter Exchange (DLX) e Política de Retries
Contexto: Dead Letter Exchange (DLX) e Política de Retries no contexto de Mensageria Assíncrona com RabbitMQ e Kafka.
Requisitos de Execução:
- Configurar fila principal com
x-dead-letter-exchangepara redirecionar mensagens com falha após 3 tentativas.
Resultado Esperado
Mensagens com falha roteadas para fila DLQ para inspeção humana.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_4_SeuNome - Envie na tarefa:
Atividade Cap 14 - Mensageria Assíncrona com RabbitMQ e Kafka
🔑 Gabarito de Código & Solução Comentada
// dlx_config.go
package main
import amqp "github.com/rabbitmq/amqp091-go"
func ObterConfiguracaoDLX() amqp.Table {
return amqp.Table{
"x-dead-letter-exchange": "dlx_exchange",
"x-dead-letter-routing-key": "pedidos_mortos",
"x-message-ttl": 60000,
}
}