Modo de trabalho do RabbitMQ Golang, obtendo consumo simultâneo por vários consumidores.
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.