Modo de trabalho do RabbitMQ Golang, obtendo consumo simultâneo por vários consumidores.

Fila de trabalho Golang

Explicação: P representa o produtor, C1 e C2 representam os consumidores, e a cor vermelha representa a fila.

Dica: Cada mensagem só pode ser consumida por um consumidor.

Pré-tutorial

Por favor, leia primeiro o Tutorial Rápido do RabbitMQ em Golang para entender as operações básicas do Golang no RabbitMQ. Se você não está familiarizado com o RabbitMQ, por favor, leia os capítulos anteriores primeiro.

Consumo Concorrente

Golang usa principalmente goroutines para implementar múltiplos consumidores, abaixo está a implementação de múltiplos consumidores.

Dica: Para saber como enviar mensagens, consulte o Tutorial Rápido do RabbitMQ em Golang.

pacote principal

import (
	"log"
	"time"

	"github.com/streadway/amqp"
)

// Tratamento de erros
func failOnError(err error, msg string) {
	se err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	// Conectar ao RabbitMQ
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "Falha ao conectar ao RabbitMQ")
	defer conn.Close()

	// Criar 5 consumidores por meio de goroutines
	para i := 0; i < 5; i++ {
		go func(number int) {
			// Criar um canal rabbitmq para cada consumidor
			ch, err := conn.Channel()
			failOnError(err, "Falha ao abrir um canal")
			defer ch.Close()

			// Declarar a fila a ser operada
			q, err := ch.QueueDeclare(
				"hello", // Nome da fila
				false,   // Durável
				false,   // Excluir quando não utilizado
				false,   // Exclusivo
				false,   // No-wait
				nil,     // Argumentos
			)
			failOnError(err, "Falha ao declarar uma fila")

			// Criar um consumidor
			msgs, err := ch.Consume(
				q.Name, // Nome da fila a ser operada
				"",     // ID de consumidor único, se não preenchido, um valor único é gerado automaticamente
				true,   // Auto-reconhecer mensagens (ou seja, confirmar automaticamente que a mensagem foi processada)
				false,  // Exclusivo
				false,  // No-local
				false,  // No-wait
				nil,    // Args
			)
			failOnError(err, "Falha ao registrar um consumidor")

			// Processar mensagens em um loop
			para d := intervalo msgs {
				log.Printf("[Número do consumidor=%d] Mensagem recebida: %s", número, d.Body)
				// Simular processamento de negócios, aguardar por 1 segundo
				time.Sleep(time.Second)
			}
		}(i)
	}

	// Suspender a principal goroutine para evitar que o programa saia
	para sempre := faça(chan bool)
	<-para sempre
}

Dica: Independentemente do tipo de troca usada pelo RabbitMQ, as filas podem ter múltiplos consumidores, e a maneira de iniciar vários consumidores é a mesma que neste exemplo.