wagslane / go-rabbitmq

A wrapper of streadway/amqp that provides reconnection logic and sane defaults
https://blog.boot.dev/golang/connecting-to-rabbitmq-in-golang-easy/
MIT License
752 stars 126 forks source link

feat: added consumer.WaitForHandlers #150

Closed astromechza closed 1 month ago

astromechza commented 6 months ago

I'd like to propose adding a WaitForHandlers method to the consumer which waits for any running handlers to complete processing their current messages. This is because Close doesn't wait for the handlers to finish or queue to be drained (this makes sense).

This solves a couple of issues I've been facing:

  1. Some message handling may be performing actions that need to clean up properly: file/database IO, external requests, even when idempotent may cause corruptions if the handlers are interrupted without being allowed to shutdown safely.

  2. Applying a circuit breaking pattern to stop a handler from consuming new messages if they are failing frequently due to overload or dependency failures.

The code in this PR could be added to the handler method itself, but I think it may be a useful pattern that others may take advantage of so I'd like to consider including it in this library.

Happy to discuss further :)

wagslane commented 4 months ago

I like this idea. I actually think .Close should just always wait for handlers though

eric-chao commented 4 months ago

I like this idea. I actually think .Close should just always wait for handlers though

How to finish the handlers gracefully?

thibleroy commented 1 month ago

Hello @astromechza, I've made some changes to support handlers completion in consumer.Close:

astromechza commented 1 month ago

I'm going to close this PR since #166 seems like a better approach :)