[erlang-questions] RabbitMQ message consumption
Fri May 12 15:54:28 CEST 2017
If the connection drops and there are un-acked messages, Rabbit will reject them all (returning them to a "ready" state). If you set up your supervision tree such that an error while working on a message takes out the process that was talking to Rabbit, this can be convenient.
If your Rabbit consumer is just handing off messages and you don't plan for it to die itself, you will need to track messages you've handed off and explicitly reject those that went to a dead consumer.
> On May 12, 2017, at 9:31 AM, Kareem Hepburn <kareemgan@REDACTED> wrote:
> Gotcha. Thanks! I was using Reject earlier but I guess Ack is sufficient to what I need to do.
> On Fri, May 12, 2017 at 8:24 AM, Bastien CHAMAGNE <bchamagne@REDACTED <mailto:bchamagne@REDACTED>> wrote:
> Once a consumer reads a message, that message goes from "READY" to "UNACKED". It's not deleted that fast! As long as it's in "UNACKED" state, it will not be delivered to anyone else. Then once your consumer have finished processing the message, it must send an ACK that will remove the message from rabbitMQ. If your consumer crashes midway through, there will be no ACK and rabbitMQ knows that it can be redistributed (message is "READY" again).
> On 12/05/2017 15:16, Kareem Hepburn wrote:
>> What about reject? The thing is, if there are multiple nodes of a worker that's consuming the message I want it that if a worker already read the message, it will not be possible to for it to be delivered to the other consumers so I am guessing ack will do this for me and reject will requeue it if my process fails.
>> Am I correct on this?
>> On Fri, May 12, 2017 at 7:56 AM, Bastien CHAMAGNE <bchamagne@REDACTED <mailto:bchamagne@REDACTED>> wrote:
>> Hi Kareem, you should ack only when your application have processed the message. See https://www.rabbitmq.com/confirms.html <https://www.rabbitmq.com/confirms.html>
>> On 12/05/2017 13:55, Kareem Hepburn wrote:
>>> Is it possible with RabbitMQ to consume a message without it being deleted and be deleted manually?
>>> Because let's say I consumed a message and started to process it and half way through processing it the application fails. I want to be able to re-process that message again. Is it possible to not delete the message and delete it manually after my process has successfully completed?
>>> To avoid duplication, I plan to use a secondary database, either Redis or Memcache to store the ID of the message to ensure that it's not being processed by more than one application.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the erlang-questions