Go: how to use RabbitMQ

Go: how to use RabbitMQ

In this article, we'll explore how to use RabbitMQ with the Go programming language to build robust and scalable message-based systems.

RabbitMQ is an open-source messaging system widely used to implement asynchronous communication between applications. In this article, we'll explore how to use RabbitMQ with the Go programming language to build robust and scalable message-based systems.

AMQP library for Go


go get github.com/streadway/amqp

Connecting to RabbitMQ

Let's start by connecting to RabbitMQ using the AMQP library in Go.


package main

import (
	"fmt"
	"log"

	"github.com/streadway/amqp"
)

func main() {
	// Connecting to RabbitMQ
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	fmt.Println("Connection to RabbitMQ established successfully!")
}

Make sure to replace the URL with the correct credentials if you have configured RabbitMQ with credentials other than the default ones.

Creating a queue

Once connected to RabbitMQ, we can create a queue to receive and send messages. In the following example, we will create a queue called "hello".


func main() {
	// ... (connecting to RabbitMQ)

	// Creating a channel
	ch, err := conn.Channel()
	if err != nil {
		log.Fatal(err)
	}
	defer ch.Close()

	// Declaration of a queue
	queueName := "hello"
	_, err = ch.QueueDeclare(
		queueName, // name of the queue
		false,     // durable
		false,     // self-delete
		false,     // exclusive
		false,     // no extra arguments
	)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Queue %s declared successfully!\n", queueName)
}

Produce messages on the queue

Now that we have a queue, we can output messages to it.


func main() {
	// ... (connecting to RabbitMQ)

	// ... (creating a queue)

	// Producing a message
	message := "Hello, world!"
	err = ch.Publish(
		"",        // empty exchange
		queueName, // name of the queue
		false,     // mandatory
		false,     // immediate
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(message),
		},
	)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Message sent: %s\n", message)
}

Consume messages from the queue

Now that we have produced a message on the queue, we can create one to consume the messages.


func main() {
	// ... (connecting to RabbitMQ)

	// ... (creating a queue)

	// ... (production of a message)

	// Consuming messages from the queue
	msgs, err := ch.Consume(
		queueName, // name of the queue
		"",        // consumer
		true,      // auto-acknowledge
		false,     // exclusivity
		false,     // no local
		false,     // no wait
		nil,       // extra arguments
	)
	if err != nil {
		log.Fatal(err)
	}

	// Loop for reading messages
	for msg := range msgs {
		fmt.Printf("Message received: %s\n", msg.Body)
	}
}

With this example, we have created a simple messaging system using RabbitMQ and Go. You can adapt this basic model to implement more complex scenarios, such as error handling, load distribution, and scalability.

Always remember to handle errors appropriately and consider security by implementing best practices for credential management and network security.