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:

  1. Conectar ao broker RabbitMQ e publicar evento de PedidoCriadoEvent serializado em JSON na fila pedidos_queue.

Resultado Esperado

Mensagem publicada na fila 'pedidos_queue' com sucesso.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_14_1_SeuNome
  2. 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:

  1. 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)

  1. Salve o arquivo como: Atividade_14_2_SeuNome
  2. 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:

  1. Gravar evento na tabela outbox_events na 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)

  1. Salve o arquivo como: Atividade_14_3_SeuNome
  2. 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:

  1. Configurar fila principal com x-dead-letter-exchange para 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)

  1. Salve o arquivo como: Atividade_14_4_SeuNome
  2. 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,
	}
}