rebus-org / Rebus.SignalR

:bus: Rebus-based SignalR backplane
Other
30 stars 6 forks source link
backplane rebus signalr

Rebus.SignalR

install from nuget

Rebus-based SignalR backplane is useful, if you are using Rebus already and/or would like to leverage Rebus' integration with various transports not supported by SignalR's own backplane integrations.

How to use

Just add AddRebusBackplane<THub>() method call for each hub, that you're going to use with Rebus.SignalR backplane.

services.AddSignalR()
    .AddRebusBackplane<ChatHub>();

Configure Rebus IBus as usual, but keep in mind several things:

Sample application 1 (RabbitMq is used as a transport with the centralized subscription storage)

If you have RabbitMq already installed locally, you can run Rebus.SignalR.Samples from your IDE or using "dotnet run" command. Another option is to use Docker Compose command from the root repository directory:

docker-compose up
private static string GenerateTransientQueueName(string inputQueueName)
{
    return $"{inputQueueName}-{Environment.MachineName}-{Guid.NewGuid().ToString()}";
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR()
        .AddRebusBackplane<ChatHub>();

    var rabbitMqOptions = Configuration.GetSection(nameof(RabbitMqOptions)).Get<RabbitMqOptions>();

    var rabbitMqConnectionString =
        $"amqp://{rabbitMqOptions.User}:{rabbitMqOptions.Password}@{rabbitMqOptions.Host}:{rabbitMqOptions.Port.ToString()}";

    services.AddRebus(configure => configure
        .Transport(x =>
        {
            x.UseRabbitMq(rabbitMqConnectionString, GenerateTransientQueueName("Rebus.SignalR"))
            .InputQueueOptions(o =>
            {
                o.SetAutoDelete(true);
                o.SetDurable(false);
            });
        })
        .Options(o => o.EnableSynchronousRequestReply())
        .Routing(r => r.TypeBased()));
}

Sample application 2 (SQL Server is used as a transport with the decentralized subscription storage)

You can modify Rebus.SignalR.Samples application to try out SqlServer transport:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR()
        .AddRebusBackplane<ChatHub>();

    var queueName = GenerateTransientQueueName("Rebus.SignalR");
    services.AddRebus(configure => configure
        .Transport(x => x.UseSqlServer(SignalRBackplaneConnectionString, queueName, isCentralized: false))
        .Options(o => o.EnableSynchronousRequestReply())
        .Routing(r => r.TypeBased()
            .MapSignalRCommands<ChatHub>(queueName))
        .Subscriptions(s => s.StoreInSqlServer(SignalRBackplaneConnectionString, "Subscriptions", false)));                    
}