RabbitMQ tutorial - Publish/Subscribe
Publish/Subscribe
(using the AMQP 1.0 .NET client)
Prerequisites
This tutorial assumes RabbitMQ is installed and running on
localhost on the standard port (5672). In case you
use a different host, port or credentials, connections settings would require
adjusting.
Where to get help
If you're having trouble going through this tutorial you can contact us through GitHub Discussions or RabbitMQ community Discord.
In the previous tutorial we created a work queue. In this tutorial we'll deliver a message to multiple consumers — the "publish/subscribe" pattern.
We'll build a simple logging system: one program emits logs, and one or more receivers print them.
Exchanges
The producer sends messages to an exchange, not directly to a queue. The exchange routes messages to queues according to its type.
Declare a fanout exchange named logs:
IExchangeSpecification exchangeSpec = management.Exchange(exchangeName).Type("fanout");
await exchangeSpec.DeclareAsync();
Bindings
Bind a temporary exclusive queue to the exchange:
IQueueSpecification tempQueue = management.Queue().Exclusive(true).AutoDelete(true);
IQueueInfo queueInfo = await tempQueue.DeclareAsync();
string queueName = queueInfo.Name();
IBindingSpecification binding = management.Binding()
.SourceExchange(exchangeSpec)
.DestinationQueue(queueName)
.Key(string.Empty);
await binding.BindAsync();
The publisher uses PublisherBuilder().Exchange(exchangeName); the consumer subscribes on queueName and calls ctx.Accept() in the handler.
Running
From dotnet-amqp:
dotnet run --project ReceiveLogs/ReceiveLogs.csproj
dotnet run --project EmitLog/EmitLog.csproj
Source
Now we can move on to tutorial 4 and learn how to route messages based on routing keys.