[ 
https://issues.apache.org/jira/browse/CAMEL-13003?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16738144#comment-16738144
 ] 

Andrea Cosentino commented on CAMEL-13003:
------------------------------------------

I think it really worth a Pull Request. Sorry for the delay.

> RabbitMQ - Publisher confirms kills performance
> -----------------------------------------------
>
>                 Key: CAMEL-13003
>                 URL: https://issues.apache.org/jira/browse/CAMEL-13003
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-rabbitmq
>    Affects Versions: 2.23.0
>            Reporter: Peter Billen
>            Priority: Major
>
> Hi Camelers,
> Disclaimer: I'm fairly new to Camel, so please bear with me.
> I would like to discuss [https://github.com/apache/camel/pull/717] and 
> possibly propose an improvement.
> In the PR mentioned above, support for publisher confirms has been 
> implemented. The related documentation can be found on 
> [https://www.rabbitmq.com/confirms.html#publisher-confirms.]
> My thoughts is that the current implementation does not perform well. 
> Basically, it has a throughput of one message at a time. I'll try to explain.
>  * On 
> [https://github.com/apache/camel/blob/master/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQProducer.java#L178,]
>  an exchange is retrieved. This contains a payload to be sent to the RabbitMQ 
> broker. The exchanges are retrieved one by one.
>  * On 
> [https://github.com/apache/camel/blob/master/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQProducer.java#L288,]
>  we start with the publication to the broker.
>  * On 
> [https://github.com/apache/camel/blob/master/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQMessagePublisher.java#L130,]
>  the RabbitMQ API `channel.basicPublish()` is used to publish the payload.
>  * Assuming that publisher confirmation is enabled, we come in 
> [https://github.com/apache/camel/blob/master/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQMessagePublisher.java#L145.]
>  Here, we call the RabbitMQ API `channel.waitForConfirmsOrDie()`. This is a 
> blocking call. It waits until the broker has confirmed that the publication 
> has been correctly processed and enqueued. Since we just published one single 
> message, we await the confirmation of that one single message.
> I believe this means that our throughput is limited to one message at a time. 
> For each message sent to RabbitMQ, we have to await the confirmation.
> I believe it would be better to avoid using `channel.waitForConfirmsOrDie()` 
> and implement a `ConfirmListener` ourselves. See 
> [https://github.com/rabbitmq/rabbitmq-java-client/blob/master/src/main/java/com/rabbitmq/client/ConfirmListener.java.]
>  This way, we can continue publications of subsequent messages, while we 
> receive ACK's or NACK's of earlier publications.
> An implementation gotcha is the fact that upon broker restart/disconnection 
> the callback `ConfirmListener.nack()` will not be automatically called by the 
> RabbitMQ, as the RabbitMQ API does not keep track of the in-flight messages. 
> (In case you are wondering, `channel.waitForConfirmsOrDie()` is implemented 
> by counting the responses.) In other words, we will have to assume a NACK for 
> all in-flight messages when the connection was closed. This also means that 
> we have to keep track of all in-flight messages, together with the 
> corresponding `AsyncCallback`, at our end.
> We also might want to limit the number of in-flight messages between the 
> component and the broker.
> What do you think?



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to