jwalton / node-amqp-connection-manager

Auto-reconnect and round robin support for amqplib.
528 stars 105 forks source link

Falsy ack after reconnect? #362

Open thomasvargiu opened 1 year ago

thomasvargiu commented 1 year ago

I was looking at the code and I see:

    /** Send an `ack` to the underlying channel. */
    ack(message: amqplib.Message, allUpTo?: boolean): void {
        this._channel && this._channel.ack(message, allUpTo);
    }

I see that under reconnection  _channel  is undefined.

Imagine that we get 1000 messages from the server and we want to consume them sequentially in a stream:

message<1>.ack() // OK
...reconnection
message<2>.ack() // FALSY OK, no channel set, ignored call to `_channel.ack`
message<3>.ack() // FALSY OK
...connected // Consumer restart
message<2>.ack() // OK

Any message during reconnection will be falsy acked and we can't known when we can stop the stream.

Am I wrong?

thomasvargiu commented 1 year ago

I think it's possibile to mitigate it listening to the ConnectionManager disconnect event, but there is no event about every time the channel closed. Ok, I know if the connection is still up and the channel closes, opening a new one is very fast and we can attach to Channel connect event, but it is emitted after the setup.

We should have the possibility to control the consuming flow. Probably a new event on every close can help to mitigate my situation.