EasyNetQ: Publisher Confirms
Join the DZone community and get the full member experience.
Join For FreePublisher 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!
Published at DZone with permission of Mike Hadlow, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments