[
https://issues.apache.org/jira/browse/NIFI-15892?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Peter Turcsanyi resolved NIFI-15892.
------------------------------------
Resolution: Won't Do
The issue will be addressed using a different approach in NIFI-15935.
> ConsumeAMQP should nack batched deliveries when ProcessSession commit fails
> ---------------------------------------------------------------------------
>
> Key: NIFI-15892
> URL: https://issues.apache.org/jira/browse/NIFI-15892
> Project: Apache NiFi
> Issue Type: Bug
> Components: Extensions
> Affects Versions: 2.9.0
> Reporter: Claudio Mattioni
> Priority: Major
> Labels: AMQP
> Time Spent: 1h 40m
> Remaining Estimate: 0h
>
> ConsumeAMQP with Auto-Acknowledge Messages set to false and Batch Size
> greater than 1 can leave RabbitMQ deliveries unacknowledged until the broker
> closes the channel due to consumer_timeout.
> Current behavior observed with NiFi/MiNiFi 2.9.0:
> - ConsumeAMQP is configured with:
> - Auto-Acknowledge Messages = false
> - Batch Size > 1
> - Prefetch Count > 1
> - RabbitMQ eventually logs:
> Consumer ... has timed out waiting for a consumer acknowledgement of a
> delivery.
> Timeout used: 1800000 ms.
> operation none caused a channel exception precondition_failed:
> delivery acknowledgement on channel 1 timed out.
> - MiNiFi then logs:
> AMQP failure, dropping the client
> AMQPException: AMQP client has lost connection
> Consumer is closed, discarding message
> This resembles the older NIFI-5896 behavior, where Batch Size > 1 with
> Auto-Acknowledge disabled could result in messages remaining unacknowledged.
> NIFI-5896 was closed with a workaround of Batch Size = 1, but the current
> ConsumeAMQP implementation still appears to acknowledge batched messages only
> after ProcessSession commit, using a cumulative ack for the last delivery tag.
> The current implementation handles the successful commit path, but does not
> explicitly nack/requeue outstanding batched deliveries when the
> ProcessSession commit fails or cannot complete successfully. In such cases,
> messages can remain unacknowledged until the RabbitMQ channel is closed by
> consumer_timeout.
> Proposed improvement:
> When Auto-Acknowledge Messages is false and a batch has been consumed:
> 1. On successful ProcessSession commit:
> - basicAck(lastDeliveryTag, true)
> 2. On ProcessSession commit failure:
> - basicNack(lastDeliveryTag, true, true)
> This would preserve the documented at-least-once behavior while allowing
> Batch Size > 1 to be used safely.
> P.S. This is marked as Major because it can make ConsumeAMQP unreliable with
> Auto-Acknowledge=false and Batch Size > 1, causing RabbitMQ channels to be
> closed due to consumer acknowledgement timeout. A workaround exists by using
> Batch Size = 1, but that significantly limits throughput.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)