You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
wagslane a98c8d0249 docs 3 years ago
.github/workflows lowercase f 4 years ago
examples docs 3 years ago
vendor deps 4 years ago
.gitignore declare exchange before binding 5 years ago
LICENSE Initial commit 5 years ago
Makefile mod 4 years ago
README.md docs 3 years ago
channel.go Change error forwarding to logging. 3 years ago
config.go fixing reconnect issues and updating close API 4 years ago
consume.go queue, exchange and binding declaration is now simplified and much clearer to use 3 years ago
consume_options.go docs 3 years ago
declare.go queue, exchange and binding declaration is now simplified and much clearer to use 3 years ago
go.mod deps 4 years ago
go.sum deps 4 years ago
logger.go lowercase f 4 years ago
publish.go lowercase f 4 years ago
publish_flow_block.go lowercase f 4 years ago
publish_options.go Move publish options to dedicated file to be on par with consume_options 4 years ago
table.go New upstream 4 years ago

README.md

go-rabbitmq

Wrapper of rabbitmq/amqp091-go that provides reconnection logic and sane defaults. Hit the project with a star if you find it useful

Supported by Boot.dev

Deploy

Motivation

Streadway's AMQP library is currently the most robust and well-supported Go client I'm aware of. It's a fantastic option and I recommend starting there and seeing if it fulfills your needs. Their project has made an effort to stay within the scope of the AMQP protocol, as such, no reconnection logic and few ease-of-use abstractions are provided.

Goal

The goal with go-rabbitmq is to provide most (but not all) of the nitty-gritty functionality of Streadway's AMQP, but to make it easier to work with via a higher-level API. go-rabbitmq is also built specifically for Rabbit, not for the AMQP protocol. In particular, we want:

  • Automatic reconnection
  • Multithreaded consumers via a handler function
  • Reasonable defaults
  • Flow control handling
  • TCP block handling

⚙️ Installation

Inside a Go module:

go get github.com/wagslane/go-rabbitmq

🚀 Quick Start Consumer

Take note of the optional options parameters after the queue name. While not necessary, you'll probably want to at least declare the queue itself and some routing key bindings.

consumer, err := rabbitmq.NewConsumer(
    "amqp://user:pass@localhost",
    rabbitmq.Config{},
    rabbitmq.WithConsumerOptionsLogging,
)
if err != nil {
    log.Fatal(err)
}
defer consumer.Close()
err = consumer.StartConsuming(
		func(d rabbitmq.Delivery) rabbitmq.Action {
			log.Printf("consumed: %v", string(d.Body))
			// rabbitmq.Ack, rabbitmq.NackDiscard, rabbitmq.NackRequeue
			return rabbitmq.Ack
		},
		"my_queue",
		// spawns 10 goroutines to handle incoming messages
		rabbitmq.WithConsumeOptionsConcurrency(10),
		// assigns a name to this consumer on the cluster
		rabbitmq.WithConsumeOptionsConsumerName(consumerName),
		rabbitmq.WithConsumeDeclareOptions(
			// creates a durable queue named "my_queue"
			// if it doesn't exist yet
			rabbitmq.WithDeclareQueueDurable,
			// binds the queue to "my_routing_key" if it isn't already
			rabbitmq.WithDeclareBindingsForRoutingKeys([]string{"my_routing_key"}),
		),
	)
if err != nil {
    log.Fatal(err)
}

🚀 Quick Start Publisher

Again, notice that all of the options functions aren't required, use them as you need them.

publisher, err := rabbitmq.NewPublisher(
    "amqp://user:pass@localhost",
    rabbitmq.Config{},
    // can pass nothing for no logging
    rabbitmq.WithPublisherOptionsLogging,
)
defer publisher.Close()
if err != nil {
    log.Fatal(err)
}
err = publisher.Publish(
	[]byte("hello, world"),
	[]string{"routing_key"},
	// optionally set the content type of the published messages
	rabbitmq.WithPublishOptionsContentType("application/json"),
	// optionally auto-declare and bind
	// to this exchange if it doens't exist yet
	rabbitmq.WithPublishOptionsExchange("events"),
)
if err != nil {
    log.Fatal(err)
}

returns := publisher.NotifyReturn()
go func() {
    for r := range returns {
        log.Printf("message returned from server: %s", string(r.Body))
    }
}()

Other usage examples

See the examples directory for more ideas.

Stability

Note that the API is currently in v0. I don't plan on any huge changes, but there may be some small breaking changes before we hit v1.

💬 Contact

Twitter Follow

Submit an issue (above in the issues tab)

Transient Dependencies

My goal is to keep dependencies limited to 1, github.com/rabbitmq/amqp091-go.

👏 Contributing

I would love your help! Contribute by forking the repo and opening pull requests. Please ensure that your code passes the existing tests and linting, and write tests to test your changes if applicable.

All pull requests should be submitted to the main branch.