Our Story

Ceremony

Just Married

EasyNetQ: Publisher Confirms

by - October 23, 2013

logo_design_150

Publisher confirms are a RabbitMQ addition to AMQP to guarantee message delivery. You can read all about them here and here. In short they provide a asynchronous confirmation that a publish has successfully reached all the queues that it was routed to.

To turn on publisher confirms with EasyNetQ set the publisherConfirms connection string parameter like this:

var bus = RabbitHutch.CreateBus("host=localhost;publisherConfirms=true");





When you set this flag, EasyNetQ will wait for the confirmation, or a timeout, before returning from the Publish method:




bus.Publish(new MyMessage
{
Text = "Hello World!"
});
// here the publish has been confirmed.




Nice and easy.

There’s a problem though. If I run the above code in a while loop without publisher confirms, I can publish around 4000 messages per second, but with publisher confirms switched on that drops to around 140 per second. Not so good.



With EasyNetQ 0.15 we introduced a new PublishAsync method that returns a Task. The Task completes when the publish is confirmed:






bus.PublishAsync(message).ContinueWith(task =>
{
if (task.IsCompleted)
{
Console.WriteLine("Publish completed fine.");
}
if (task.IsFaulted)
{
Console.WriteLine(task.Exception);
}
});





Using this code in a while loop gets us back to 4000 messages per second with publisher confirms on.



Happy confirms!

You May Also Like

0 comments