RabbitMQ

One of the transports available for Cambion uses RabbitMQ to send data between instances of Cambion. The RabbitMQ transport requires a dedicated RabbitMQ instance either hosted on a dedicated server or in the cloud. This documentation will not cover how to set up RabbitMQ as there are detailed instructions on their website.

Installation

As with other transports, the RabbitMQ transport for Cambion is also available on NuGet so you can install it using the NuGet Package Manager Console:

Install-Package Whitestone.Cambion.Transport.RabbitMQ

Usage

The RabbitMQ transport can be set up using one of the two provided extension methods to ICambionBuilder. The easiest of these uses the standard single line URI:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCambion()
        .UseRabbitMqTransport("amqp://username:password@hostname/vhost");
}

When you need more control over the RabbitMQ setup you should use the extension method that overrides the default configuration with a RabbitMqConfig:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCambion()
        .UseRabbitMqTransport(conf => {
            conf.Connection.Hostname = "hostname";
            conf.Connection.Username = "username";
            conf.Connection.Password = "password";
            conf.Connection.VirtualHost = "vhost";
        });
}

Additional settings

Cambion uses a pub/sub pattern, and will create a durable “fanout” exchange with auto-delete enabled by default. This exchange is named cambion.fanout.

It will also create a durable and exclusive queue with auto-delete enabled, named cambion-<Guid>, and connect this to the previously created exchange. Seeing as it has a Guid in its name the name will be unique.

The exchange/queue names and types can be configured using the extension method that overrides the default configuration. The following is a list of all possible configuration parameters:

Group

Parameter name

Required

Description

Default value

Connection

Hostname

Yes

The hostname of the RabbitMQ server

null

Username

Yes

The username needed to connect

null

Password

Yes

The password needed to connect

null

VirtualHost

No

The vhost on the RabbitMQ server

“/”

Port

No

The port that RabbitMQ listens on

5672

Exchange

Name

No

The name of the exchange

“cambion.fanout”

Type

No

Exchange type

“fanout”

Durable

No

Creates a durable exchange

true

AutoDelete

No

Exchange will be deleted when no longer in use

true

Queue

Name

No

The name of the queue

“cambion-<Guid>”

Durable

No

Creates a durable queue

true

Exclusive

No

Creates an exclusive queue

true

AutoDelete

No

Queue will be deleted when no longer in use

true

Note

The Exchange.Type must be one of RabbitMQ’s supported types: fanout, direct, headers or topic. These are subject to change.

Note

Cambion uses a pub/sub pattern. RabbitMQ recommends using a fanout exchange for this pattern, so it is recommended to leave the Exchange.Type setting to its default value.

For more detailed descriptions of these settings, refer the RabbitMQ documentation.

To use a non-durable exchange named “Cambion”, with a non-exclusive and non-durable queue named “CambionQueue”, you can use the following configuration:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCambion()
        .UseRabbitMqTransport(conf => {
            conf.Connection.Hostname = "hostname";
            conf.Connection.Username = "username";
            conf.Connection.Password = "password";
            conf.Exchange.Name = "Cambion";
            conf.Exchange.Durable = false;
            conf.Queue.Name = "CambionQueue";
            conf.Queue.Exclusive = false;
            conf.Queue.Durable = false;
        });
}

External configuration

In addition to configuring through Action<RabbitMqConfig> you can also pass in an Microsoft.Extensions.Configuration.IConfiguration object that has been populated with settings through appsettings.json, environment variables, user secrets, or similar sources.

public void ConfigureServices(HostBuilderContext ctx, IServiceCollection services)
{
    services.AddCambion()
        .UseRabbitMqTransport(ctx.Configuration);
}

This expects the configuration to have been set up according to Configuration Reader.

Any settings missing in the configuration will be set to the default values for the object type in RabbitMqConfig.

Any settings defined in the configuration can also be owerwritten through the Action<RabbitMqConfig>:

public void ConfigureServices(HostBuilderContext ctx, IServiceCollection services)
{
    services.AddCambion()
        .UseRabbitMqTransport(
            ctx.Configuration,
            conf => conf.Connection.Hostname = "hostname");
}

As with the Configuration Reader you can also override which settings object to read from, so instead of the default Cambion override it by passing a new configuration key:

public void ConfigureServices(HostBuilderContext ctx, IServiceCollection services)
{
    services.AddCambion()
        .UseRabbitMqTransport(ctx.Configuration, "Example");
}

Note

As with the Configuration Reader you cannot change the “Transport” key.

Example JSON

{
    "Cambion": {
        "Transport": {
            "Whitestone.Cambion.Transport.RabbitMQ": {
                "Connection": {
                    "Hostname": "hostname",
                    "Username": "username",
                    "Password": "password"
                },
                "Exchange": {
                    "Name": "Cambion",
                    "Durable": false
                },
            }
        }
    }
}